递归函数nestedAdd中sum变量为何未重置为0?
为什么递归中的sum能持续累加?
你误解了递归调用中变量的作用范围:每次调用nestedAdd都会创建一个全新的函数执行上下文,里面的sum是当前调用独有的局部变量。let sum = 0确实会把当前这个调用里的sum重置为0,但不同调用的sum完全是分开的,互不影响。
拿你的代码举例,我们一步步拆解执行过程:
- 最外层调用
nestedAdd([[[2]], 1, [1, 3]]):- 这里的
sum初始化为0,开始遍历数组的三个元素。 - 第一个元素是
[[2]],是数组,于是调用nestedAdd([[2]]):- 这个新调用里的
sum初始化为0,遍历元素[2](数组),调用nestedAdd([2]):- 这个调用的
sum初始化为0,遍历元素2(不是数组),sum += 2后sum变成2,返回2。
- 这个调用的
- 回到
nestedAdd([[2]]),把返回的2加到自己的sum里,sum变成0+2=2,返回2。
- 这个新调用里的
- 最外层的sum现在是0+2=2。
- 第二个元素是1,不是数组,
sum +=1后sum变成3。 - 第三个元素是
[1,3],调用nestedAdd([1,3]):- 这个调用的
sum初始化为0,遍历1和3:- 1不是数组,sum +=1 → sum=1;
- 3不是数组,sum +=3 → sum=4,返回4。
- 这个调用的
- 最外层的sum加上4,变成3+4=7,最终返回7。
- 这里的
简单说:每个递归调用的sum都是从0开始计算当前子数组的和,然后把这个子数组的和返回给上层调用,上层调用再把它加到自己的sum里。看起来像是sum在持续累加,其实是多个独立的sum变量层层传递结果的过程。
内容的提问来源于stack exchange,提问作者Matthew Kaye
相关产品推荐
相关产品推荐

