登录
首页 >  Golang >  Go问答

使用递归填充地图时出现意外行为

来源:stackoverflow

时间:2024-04-08 12:27:33 329浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《使用递归填充地图时出现意外行为》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

目标是计算由一组 n 个字符串组成的所有可能的长度为 k 的切片。

我尝试使用简单的递归来做到这一点。只需打印结果就可以了。对于大于 2 的奇数 k,将结果放入映射中会产生一些意想不到的结果。

什么原因导致地图的键与其对应的值之间存在差异?

https://play.golang.org/p/_sgrprfjj5g

package main

import (
    "fmt"
    "strings"
)

func main() {
    qqm := make(map[string][]string)
    
    states := []string{
        "a",
        "b",
    }

    var perm func(q []string, k int)

    perm = func(q []string, k int) {
        if k == 0 {
            qqm[strings.join(q, "")] = q
            fmt.println(qqm)
            return
        }

        for i := 0; i < len(states); i++ {
            perm(append(q, states[i]), k-1)
        }
    }

    perm([]string{}, 4)
}
map[aaaa:[a a a a]]
map[aaaa:[a a a b] aaab:[a a a b]]
map[aaaa:[a a a b] aaab:[a a a b] aaba:[a a b a]]
...

正确答案


切片是底层数组的视图。当您传递切片时,您传递的不是它们包含的值,而是对这些值的引用。因此,当您将一个切片放入映射中,然后向该切片添加元素时,如果该切片有容量,您也会向映射中的切片添加元素。

在放入地图之前复制切片:

newQ:=make([]string,len(Q))
copy(newQ,Q)
QQM[strings.Join(Q, "")] = newQ

今天关于《使用递归填充地图时出现意外行为》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>