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

数组Running Sum问题求解:现有JS代码存疑,寻求优化及递归思路

解决数组累加和(Running Sum)问题的思路与修正方案

你的代码问题所在

你当前代码的bug出在else分支的计算逻辑上——你用了num + nums[idx - 1],但这里应该加的是累加结果数组里的前一项result[idx - 1],而不是原数组的前一个元素。举个例子,输入[3,1,2,10,1]时,第三个元素(索引2)的正确累加值是前一个累加结果4+2=6,但你的代码会计算2+1=3,这就导致结果错误。

修正后的迭代代码:

var runningSum = function(nums) {
    let result = [];
    nums.forEach(function(num, idx) {
         if (idx === 0) {
             result.push(num);
         } else {
             result.push(num + result[idx - 1]);  // 改为取累加结果的前一项
         }
    });
    return result;
}

更简便的解法

1. 原地修改数组(空间复杂度O(1))

如果题目允许修改原数组,这是最简洁高效的解法,不需要额外开辟结果数组:

var runningSum = function(nums) {
    for (let i = 1; i < nums.length; i++) {
        nums[i] += nums[i - 1];
    }
    return nums;
}

2. 使用reduce/map简化代码

利用JavaScript的数组方法可以一行搞定,逻辑清晰直观:

// 用map+累加变量的写法
var runningSum = function(nums) {
    let sum = 0;
    return nums.map(num => sum += num);
}

// 用reduce的写法
var runningSum = function(nums) {
    return nums.reduce((acc, curr) => {
        acc.push(acc.length ? acc.at(-1) + curr : curr);
        return acc;
    }, []);
}

递归实现的思路

递归的核心是把问题拆解成子问题:

  • 终止条件:当输入数组长度为1时,直接返回该数组(单个元素的累加和就是它本身)。
  • 递归步骤:先递归计算前n-1个元素的累加和数组,再将最后一个元素与递归结果的最后一项相加,拼接到结果末尾。

代码实现:

var runningSum = function(nums) {
    if (nums.length === 1) {
        return nums;
    }
    // 递归处理前n-1个元素
    let prevSum = runningSum(nums.slice(0, -1));
    // 计算当前最后一个元素的累加值并追加
    prevSum.push(prevSum.at(-1) + nums.at(-1));
    return prevSum;
}

注意:递归的空间复杂度更高(存在调用栈开销),所以迭代解法通常是这类问题的最优选择,但递归可以帮助理解分治思想。

内容的提问来源于stack exchange,提问作者jo A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:15:46