Recursion 围棋中的组合和

Recursion 围棋中的组合和,recursion,go,Recursion,Go,这就是我想要的答案! 但为什么最终答案是(二维): 预期答案是:[[1,1,1,1],[1,1,2],[2,2]] 请帮我找出代码中的错误。谢谢您的时间。这是因为切片的工作方式。切片对象是对底层数组的引用,以及切片的长度、指向数组中切片起点的指针和切片的容量。切片的容量是从切片开始到数组结束的元素数。追加到切片时,如果新元素有可用容量,则会将其添加到现有数组中。但是,如果没有足够的容量,append将分配一个新数组并复制元素。新阵列分配了额外的容量,因此不需要为每个追加分配容量 在for循环中,

这就是我想要的答案! 但为什么最终答案是(二维):

预期答案是:[[1,1,1,1],[1,1,2],[2,2]]


请帮我找出代码中的错误。谢谢您的时间。

这是因为切片的工作方式。切片对象是对底层数组的引用,以及切片的长度、指向数组中切片起点的指针和切片的容量。切片的容量是从切片开始到数组结束的元素数。追加到切片时,如果新元素有可用容量,则会将其添加到现有数组中。但是,如果没有足够的容量,
append
将分配一个新数组并复制元素。新阵列分配了额外的容量,因此不需要为每个追加分配容量

for
循环中,当
curComb
[1,1,1]
时,其容量为4。在循环的连续迭代中,先追加1,然后追加2,这两者都不会导致重新分配,因为数组中有足够的空间容纳新元素。当
curComb
[1,1,1,1]
时,它会被放在结果列表上,但在
for
循环的下一次迭代中,
append
会将最后一个元素更改为2(请记住,它是相同的底层数组),因此在最后打印结果时会看到这一点

解决方法是,当总和等于目标值时,返回一份
curComb

[[1,1,1,2],[1,1,2],[2,2]]
很好地解释了切片的工作原理

[1,1,1,1]
[1,1,2]
[2,2]
[[1,1,1,2],[1,1,2],[2,2]]
if sum == target {
    fmt.Println(curComb)
    tmpCurComb := make([]int, len(curComb))
    copy(tmpCurComb, curComb)
    return [][]int{tmpCurComb}