方法中的值已更改

我正在使用递归解决 leetcode 中的问题。但是,用作参数的值在方法中发生了变化。


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)

}

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 值?


jeck猫
浏览 105回答 1
1回答

MYYA

让我们从递归开始,调用的最后一个递归循环makeCmbscmbs = 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=0start of function: num:[1 2 3 4] cmbs:[] remains:[5], k:0所以if k=0条件是true&nbsp; &nbsp; if k == 0 {&nbsp; &nbsp; &nbsp; &nbsp; cmbs = append(cmbs, nums)&nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("in side if: num:%d cmbs:%v k:%v\n", nums, cmbs, k)&nbsp; &nbsp; &nbsp; &nbsp; return cmbs&nbsp; &nbsp; }这是递归的第一个返回因为 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)在这里循环结束所以它也返回相同的&nbsp;[[1 2 3 4]]但在此之前,递归 nums 是 nums+num 的追加,[1 2 3 5]这就是为什么当它在同一 for 循环调用 cmbs hold 的倒数第二次递归中返回时[1 2 3 5]。这确实是一个难以想象的问题,但可以通过调试器轻松解决。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go