使用递归填充映射时出现意外行为



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

我试着用一个简单的递归来实现它。只需打印结果就可以了。对于大于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

最新更新