JavaScript 中使用递归计算前缀和(创建递增和的数组)


考虑以下数字数组:

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),它返回从索引 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 ]

更新于: 2020年8月20日

306 次浏览

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告

© . All rights reserved.