在 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)返回从索引开始到最后的 arr 元素的总和。

  • 其次是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 ]

猜你喜欢