亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

方法中的值已更改

方法中的值已更改

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 關注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號