gpt4 book ai didi

go - 方法中的值已更改

转载 作者:行者123 更新时间:2023-12-01 22:40:37 25 4
gpt4 key购买 nike

我正在使用递归解决leetcode中的problem
但是,在方法中将更改用作参数的值。

package main

import "fmt"

func makeCmbs(cmbs [][]int, nums []int, remains []int, k int) [][]int {
fmt.Println("==", cmbs, nums, remains, k) // (2)
if k == 0 {
cmbs = append(cmbs, nums)
fmt.Println("!", nums, cmbs)
return cmbs
}

for i, num := range remains {
fmt.Printf("-[%d] num:%d cmbs:%v remains:%v\n", i, num, cmbs, remains) // (1) cmbs here is [[1,2,3,4]]
cmbs = makeCmbs(cmbs, append(nums, num), remains[i+1:], k-1) // cmbs in makeCmbs method is [[1,2,3,5]] ???
fmt.Printf("+[%d] num:%d cmbs:%v\n", i, num, cmbs)
}

return cmbs
}

func combine(n int, k int) [][]int {
remains := make([]int, n)
for i := 0; i < n; i++ {
remains[i] = i + 1
}

return makeCmbs([][]int{}, []int{}, remains, k)
}

func main() {
combine(5, 4)
}

波纹管是其输出的开始。
== [] [] [1 2 3 4 5] 4
-[0] num:1 cmbs:[] remains:[1 2 3 4 5]
== [] [1] [2 3 4 5] 3
-[0] num:2 cmbs:[] remains:[2 3 4 5]
== [] [1 2] [3 4 5] 2
-[0] num:3 cmbs:[] remains:[3 4 5]
== [] [1 2 3] [4 5] 1
-[0] num:4 cmbs:[] remains:[4 5]
== [] [1 2 3 4] [5] 0
! [1 2 3 4] [[1 2 3 4]]
+[0] num:4 cmbs:[[1 2 3 4]]
-[1] num:5 cmbs:[[1 2 3 4]] remains:[4 5] <---- cmbs is [[1 2 3 4]]
== [[1 2 3 5]] [1 2 3 5] [] 0 <---- why [[1 2 3 5]] ???

正如您看到的后两行所示,cmbs [[1 2 3 4]]变为[[1 2 3 5]]。
有人可以告诉我为什么makeCmbs方法中的cmbs值会改变吗?

最佳答案

让我们从递归开始调用makeCmbs的最后一个递归循环

cmbs = makeCmbs(cmbs, append(nums, num), remains[i+1:], k-1)

就像剩下的[i + 1:],其中最后一个循环的i值将是最高的
i = len(remains-1)

因此,这意味着 i+1len(remains-1)大两(2)步,这就是为什么 remain[i+1]在最后两轮回合中将为空 array ([])的原因。

这就是它的工作方式。我希望我达到了这个问题的想象高度。

更新:

第一次当 k=0
start of function: num:[1 2 3 4] cmbs:[] remains:[5], k:0

所以 if k=0条件是 true
    if k == 0 {
cmbs = append(cmbs, nums)
fmt.Printf("in side if: num:%d cmbs:%v k:%v\n", nums, cmbs, k)
return cmbs
}

那是递归的第一个返回

如cmbs = []和nums = [1 2 3 4]
cmbs = append(cmbs, nums)

现在,如果条件为[[1 2 3 4]],则重新调整的值为cmb,此行的for循环
cmbs = makeCmbs(cmbs, append(nums, num), remains[i+1:], k-1)

循环在这里结束,所以它也返回相同的
 [[1 2 3 4]]

但是在此之前,递归nums是numt + num的追加,即 [1 2 3 5],因此这就是为什么当它在第二次递归中以相同的for循环调用返回时,cmbs会保留 [1 2 3 5]

这确实是一个很难解决的问题,但是可以使用调试器轻松解决。

关于go - 方法中的值已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60420234/

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