You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归求和函数栈溢出,求两种实现方案(含/不含额外变量)

嵌套结构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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:26:11