使用 JavaScript 中的递归对总和进行前缀和(创建总和不断增加的数组)
javascriptweb developmentobject oriented programming更新于 2025/9/30 2:52:17
考虑以下数字数组 −
const arr = [10, 5, 6, 12, 7, 1];
其连续元素的总和每次都比前一个元素少一个,则为 −
[10, 5, 6, 12, 7, 1] = 10 + 5 + 6 + 12 + 7 + 1 = 41; [5, 6, 12, 7, 1] = 5 + 6 + 12 + 7 + 1 = 31; [6, 12, 7, 1] = 6 + 12 + 7 + 1 = 26; [12,7,1] = 12 + 7 + 1 = 20; [7, 1] = 7 + 1 = 8; [1] = 1 = 1;
因此,最终输出应为类似这样的数组 −
[ 41, 31, 26, 20, 8, 1 ]
我们需要编写一个函数,该函数接受一个这样的数组并返回 partialSum 数组,如上例所示。
方法 1:同时使用 map() 和 reduce()
这里的想法很简单,因为我们需要为数组中的每个元素返回一个特定元素,我们可以使用 Array.prototype.map() 方法,它正是为我们执行此操作。
如果我们通过比较特定索引使 map() 方法返回所需元素的减少总和,我们将完成工作。
因此,这是执行此操作的代码 −
const arr = [10, 5, 6, 12, 7, 1];
const partSum = arr.map((item, index) => {
return arr.reduce((acc, val, ind) => {
return ind >= index ? acc+val : acc;
}, 0);
});
console.log(partSum);
方法 2:使用递归函数
这里我们将使用两个递归函数,
第一个是 sumRecursively(arr, start),它返回 arr 中从索引 start 到末尾的元素之和。
第二个是 partSumRecursively(),它以递归方式将所需的总和连接到一个数组中,当我们到达数组末尾时,它会返回连接的数组。
执行此操作的代码将是 −
示例
const arr = [10, 5, 6, 12, 7, 1];
const sumRecursively = (arr, start = 0, res = 0) => {
if(start < arr.length){
return sumRecursively(arr, start+1, res+arr[start]);
};
return res;
};
const partSumRecursively = (arr, partSum = [], start = 0, end =
arr.length-1) => {
if(start <= end){
return partSumRecursively(arr, partSum.concat(sumRecursively(arr,
start)), ++start, end);
};
return partSum;
};
console.log(partSumRecursively(arr));
输出
这两种方法在控制台中的输出都是 −
[ 41, 31, 26, 20, 8, 1 ]
相关文章
有用资源
javascript 参考教程 - 该教程包含有关 javascript 的更多信息:https://www.cainiaomax.com/javascript/

