gpt4 book ai didi

go - 为什么 slice 值会改变?

转载 作者:IT王子 更新时间:2023-10-29 01:41:41 24 4
gpt4 key购买 nike

附加到二维 slice 的 slice 的值稍后会更改。为什么会发生?

完整代码如下:

import "sort"
import "fmt"

func combinationSum(candidates []int, target int) [][]int {
sort.Ints(candidates)
var ret [][]int
var curlist []int
combinationSumRecursive(candidates, target, 0, curlist, &ret)
fmt.Println("ret", ret)
return ret
}

func combinationSumRecursive(candidates []int, target int, curCandidateIdx int, curlist []int, ret *[][]int) {
if target == 0 {
fmt.Println("put", curlist)
*ret = append(*ret, curlist)
return
}
for i:=curCandidateIdx;i<len(candidates);i++{
if candidates[i] > target {
break
}
combinationSumRecursive(candidates, target - candidates[i], i, append(curlist, candidates[i]), ret)
}
}

输入是:

[7,3,2]
18

输出如下:

put [2 2 2 2 2 2 2 2 2]
put [2 2 2 2 2 2 3 3]
put [2 2 2 2 3 7]
put [2 2 2 3 3 3 3]
put [2 2 7 7]
put [2 3 3 3 7]
put [3 3 3 3 3 3]
ret [[2 2 2 2 2 2 2 2 2] [2 2 2 2 2 7 3 3] [2 2 2 2 3 7] [2 2 2 3 3 3 3] [2 2 7 7] [2 3 3 3 7] [3 3 3 3 3 3]]

ret 中的第二个 slice 已更改。 [2 2 2 2 2 2 3 3] 是预期的。

感谢任何帮助。

最佳答案

这是由于 combinationSumRecursive(candidates, target - candidates[i], i, append(curlist, candidates[i]) 行的 append 中 slice curlist 的变化引起的, ret).

一个解决方案是在将附加结果传递到下一个递归级别之前将其重新分配给 curlist

package main

import "sort"
import "fmt"

func combinationSum(candidates []int, target int) [][]int {
sort.Ints(candidates)
var ret [][]int
var curlist []int
combinationSumRecursive(candidates, target, 0, curlist, &ret)
fmt.Println("ret", ret)
return ret
}

func combinationSumRecursive(candidates []int, target int, curCandidateIdx int, curlist []int, ret *[][]int) {
if target == 0 {
fmt.Println("put", curlist)
*ret = append(*ret, curlist)
return
}
for i := curCandidateIdx; i < len(candidates); i++ {
if candidates[i] > target {
break
}
curlist = append(curlist, candidates[i])
combinationSumRecursive(candidates, target-candidates[i], i, curlist, ret)
}
}

func main() {
combinationSum([]int{7, 3, 2}, 18)
}

这会产生:

put [2 2 2 2 2 2 2 2 2]
put [2 2 2 2 2 2 3 3]
put [2 2 2 2 3 7]
put [2 2 2 3 3 3 3]
put [2 2 7 7]
put [2 3 3 3 7]
put [3 3 3 3 3 3]
ret [[2 2 2 2 2 2 2 2 2] [2 2 2 2 2 2 3 3] [2 2 2 2 3 7] [2 2 2 3 3 3 3] [2 2 7 7] [2 3 3 3 7] [3 3 3 3 3 3]]

[编辑] 首先阅读 this .这解释了虽然您看到 slice header 的地址发生了变化,但在追加之后后备数组仍然可以保持不变。

然后 this是您的案例中发生的情况的示例。由于递归调用和将当前索引重新定位到 curlist 中,您的问题很难看出来。

关于go - 为什么 slice 值会改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42572569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com