为了账号安全,请及时绑定邮箱和手机立即绑定

方法中的值已更改

方法中的值已更改

Go
jeck猫 2022-05-18 14:53:15
我正在使用递归解决 leetcode 中的问题。但是,用作参数的值在方法中发生了变化。package mainimport "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)}Bellow是它输出的开始。== [] [] [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 值?
查看完整描述

1 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

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


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

仍然是[i+1:],其中 i 在最后一个循环中的值将是最高的,即


i = len(remains-1)

所以这意味着它意味着i+1比前两 (2) 大两 (2)次len(remains-1),这就是为什么前两轮最后一次恢复轮次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)

现在返回值是 cmb 从 if 条件是 [[1 2 3 4]] 到 for 循环这一行


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

在这里循环结束所以它也返回相同的


 [[1 2 3 4]]

但在此之前,递归 nums 是 nums+num 的追加,[1 2 3 5]这就是为什么当它在同一 for 循环调用 cmbs hold 的倒数第二次递归中返回时[1 2 3 5]。


这确实是一个难以想象的问题,但可以通过调试器轻松解决。


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信