考虑以下数字数组 -
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 数组,如上例所示。
这里的想法很简单,因为我们需要为数组中的每个元素返回一个特定的元素,我们可以使用 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);
这里我们将使用两个递归函数,
首先是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 ]