我有兩個 Go 函數:func permutation(prefix, str []int) { n := len(str) if n == 0 { fmt.Println(prefix) } else { for i := 0; i < n; i++ { permutation( append(prefix, str[i]), append(str[0:i], str[i+1:]...), ) } }}func perms(prefix, str string) { n := len(str) if n == 0 { fmt.Println(prefix) } else { for i := 0; i < n; i++ { perms( prefix+string(str[i]), string(str[0:i])+string(str[i+1:]), ) } }}第一個需要一個整數數組,第二個需要一個字符串。然后他們都計算數組或字符串的所有排列。我可以像這樣運行它們:permutation([]int{}, []int{1, 2, 3})perms("", "123")他們的輸出是不一樣的:$ go run main.go[1 2 3][1 3 3][3 3 3][3 3 3][3 3 3][3 3 3]123132213231312321我想附加我缺少的數組有一些細微差別。我似乎無法弄清楚。知道發生了什么嗎?
1 回答

慕田峪4524236
TA貢獻1875條經驗 獲得超5個贊
雖然str1+str2確實返回了新的(與內存無關)字符串,append但不會以這種方式運行。例如append(str[0:i], str[i+1:]...)會破壞原來的內容str,覆蓋str[i:]用str[i+1:]。這是因為str[0:i]將有能力追加str[i+1:]而不分配新的緩沖區。
解決方案是在每次迭代中創建一個全新的數組。至少對于str,因為append(prefix, str[i])是免疫這個問題的。例如:
for i := 0; i < n; i++ {
var s []int
s = append(s, str[0:i]...)
s = append(s, str[i+1:]...)
permutation(append(prefix, str[i]), s)
}
https://play.golang.org/p/lXwu39AA0V
有關切片和附加機制的更多信息:
http://blog.golang.org/go-slices-usage-and-internals
https://blog.golang.org/slices
- 1 回答
- 0 關注
- 162 瀏覽
添加回答
舉報
0/150
提交
取消