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 关注
- 104 浏览
添加回答
举报