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.