嵌套数组元素按深度相乘求和的递归实现问题及层级控制疑问
代码存在的问题
你的代码里level是全局变量,进入嵌套数组后增加了level,但处理完子数组后没有把level回退到之前的值,导致后续元素的深度计算错误。比如:
- 处理最外层数组时level=1,遇到子数组
[2,6,[3,2],4],level变成2; - 再遇到子数组
[3,2],level变成3,处理完这两个元素后,level没有减回2; - 此时处理后面的元素
4时,会用level=3计算,得到43=12,但正确应该是24=8; - 最终总和会比正确值大,得不到53。
正确控制level的两种方式
方式1:将level作为递归参数传递(推荐,无全局变量副作用)
把level作为函数参数,每次进入子数组时传递level+1,不需要修改全局变量,逻辑更清晰:
function calculateSum(arr, level = 1) { let sum = 0; arr.forEach(item => { if (Array.isArray(item)) { sum += calculateSum(item, level + 1); } else { sum += item * level; } }); return sum; } const arr = [1,2,4,[2,6,[3,2],4],7]; console.log(calculateSum(arr)); // 输出53
方式2:使用全局变量但增加回溯逻辑
如果要保留全局变量的写法,需要在处理完子数组后把level减回去(回溯),确保每个层级的level正确:
let level = 1; let sum = 0; function recursive(arr){ arr.forEach(i=> { multiplier(i) }) } function multiplier(i){ if(Array.isArray(i)){ level++; recursive(i); level--; // 处理完子数组后回退level } else { sum += i*level; } } const arr = [1,2,4,[2,6,[3,2],4],7]; recursive(arr); console.log(sum); // 输出53
内容的提问来源于stack exchange,提问作者JA007
相关产品推荐
相关产品推荐

