为什么递归迭代时arraySum每次重初始化为0却能保留之前的累加值?
问题原因解释
你观察到的“arraySum每次递归都被初始化为0但还能保留累加结果”,本质是因为每个递归调用的arraySum都是独立的局部变量,不同层级的调用完全互不干扰,计算结果是通过返回值向上传递累加的,具体逻辑拆解如下:
- 每次执行
productSum函数时,JS都会为这次调用创建独立的执行上下文,你声明的let arraySum = 0是只属于当前调用的局部变量,和其他层递归的arraySum是完全不同的变量,只会用来统计当前层级数组的元素和。 - 当遍历到元素是子数组时,会触发新的递归调用处理这个子数组,子调用内部的
arraySum确实会初始化为0统计子数组的和,计算完成后会把「子数组和 * 对应嵌套倍数」的结果返回给父级调用,父级直接把这个返回值加到自己的arraySum里。 - 父级调用的
arraySum从来没有被重置过,你看到的初始化0只发生在新触发的子调用内部,父级的累加值一直都存在于自己的执行上下文中,自然不会丢失。
举个你测试用例里的具体场景方便理解:
当遍历到第一层的子数组[7, -1]时,会触发multiplier为2的递归调用:
- 子调用内部arraySum初始化为0,累加7和-1得到6,返回
6 * 2 = 12 - 父级调用拿到返回值12,直接加到自己的arraySum里,此时父级的arraySum已经累加了之前的5+2,加上12后变成19,继续遍历后面的元素
实现代码
function productSum(array, multiplier=1) { let arraySum = 0; array.forEach(el => Array.isArray(el) ? arraySum+=productSum(el, multiplier+1) : arraySum += el) return arraySum * multiplier } // 测试用例输出结果为12,符合乘积和计算要求 productSum([5, 2, [7, -1], 3, [6, [-13, 8], 4]])
内容的提问来源于stack exchange,提问作者Spacecase
相关产品推荐
相关产品推荐

