1 回答

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]。
這確實是一個難以想象的問題,但可以通過調試器輕松解決。
- 1 回答
- 0 關注
- 123 瀏覽
添加回答
舉報