递归求和函数栈溢出,求两种实现方案(含/不含额外变量)
嵌套结构
number字段求和实现(解决栈溢出) 原代码问题分析
- 遇到数字类型时,错误递归调用
getSumOfNumbers(numbers),导致无限递归触发栈溢出 - 数组、对象遍历的递归调用未收集返回值,无法完成累加求和
- 未针对性处理
number字段,会遍历对象所有属性,不符合需求
1. 使用额外变量的实现方式
通过闭包维护一个累加变量,递归遍历过程中不断更新该变量,最后返回结果,逻辑直观且避免无限递归。
const numbers = [ { "number": [ { "number": 3, }, { "number": [ { "number": 5 } ] }, ] }, { "number": 8 } ]; function getSumOfNumbers(data) { let sum = 0; // 额外累加变量 function traverse(node) { // 终止条件:遇到数字直接累加 if (typeof node === 'number') { sum += node; return; } // 处理数组:遍历每个元素继续递归 if (Array.isArray(node)) { node.forEach(item => traverse(item)); return; } // 处理对象:仅遍历`number`字段对应的值 if (typeof node === 'object' && node !== null) { for (const key in node) { if (key === 'number') { traverse(node[key]); } } } } traverse(data); return sum; } console.log(getSumOfNumbers(numbers)); // 输出 16(3+5+8)
关键说明
- 内部
traverse函数负责递归遍历,外部sum变量统一记录累加结果 - 明确终止条件,遇到数字直接停止递归并累加
- 仅处理对象中的
number字段,精准匹配需求
2. 不使用额外变量的实现方式
纯递归实现,每一层递归返回当前层级的求和结果,上层递归直接累加这些返回值,无需额外维护变量。
const numbers = [ { "number": [ { "number": 3, }, { "number": [ { "number": 5 } ] }, ] }, { "number": 8 } ]; function getSumOfNumbers(data) { // 终止条件:遇到数字直接返回自身 if (typeof data === 'number') { return data; } // 处理数组:用reduce累加每个元素的递归结果 if (Array.isArray(data)) { return data.reduce((total, item) => total + getSumOfNumbers(item), 0); } // 处理对象:仅累加`number`字段对应值的递归结果 if (typeof data === 'object' && data !== null) { let total = 0; for (const key in data) { if (key === 'number') { total += getSumOfNumbers(data[key]); } } return total; } // 非目标类型返回0,不影响求和结果 return 0; } console.log(getSumOfNumbers(numbers)); // 输出 16(3+5+8)
关键说明
- 所有分支都有明确返回值,避免无效递归
- 数组用
reduce简化累加逻辑,代码更简洁 - 完全通过递归返回值传递求和结果,无额外变量依赖
内容的提问来源于stack exchange,提问作者quester
相关产品推荐
相关产品推荐

