Hãy xem xét dãy số sau -
const arr = [10, 5, 6, 12, 7, 1];
Tổng các phần tử liên tiếp của nó lấy đi một phần tử ít hơn trong mỗi lượt đi sẽ là -
[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;
Vì vậy, đầu ra cuối cùng phải là một mảng như thế này -
[ 41, 31, 26, 20, 8, 1 ]
Chúng tôi bắt buộc phải viết một hàm nhận vào một mảng như vậy và trả về mảngback một phần trong mảng như được minh họa trong ví dụ trên.
Phương pháp 1:Sử dụng map () và Reduce () cùng nhau
Ý tưởng ở đây rất đơn giản, vì chúng tôi được yêu cầu trả về một phần tử cụ thể cho mỗi và mọi phần tử trong mảng, chúng tôi có thể sử dụng phương thức Array.prototype.map () để thực hiện chính xác điều này cho chúng tôi.
Và nếu chúng tôi thực hiện phương thức map () để trả về tổng thu nhỏ của các phần tử bắt buộc bằng cách so sánh các chỉ số cụ thể, chúng tôi sẽ hoàn thành công việc.
Vì vậy, đây là mã để thực hiện việc này -
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);
Phương pháp 2:Sử dụng các hàm đệ quy
Ở đây chúng ta sẽ sử dụng hai hàm đệ quy,
-
Đầu tiên là sumRecursently (arr, start) trả về tổng các phần tử của arr từ đầu chỉ mục cho đến cuối.
-
Thứ hai là partSumRecursently () nối đệ quy tổng được yêu cầu vào anarray và khi chúng ta đến cuối mảng, nó sẽ trả về mảng đã nối.
Mã để thực hiện việc này sẽ là -
Ví dụ
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));
Đầu ra
Đầu ra trong bảng điều khiển cho cả hai phương thức sẽ là -
[ 41, 31, 26, 20, 8, 1 ]