พิจารณาอาร์เรย์ของตัวเลขต่อไปนี้ -
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 ]
เราจำเป็นต้องเขียนฟังก์ชันที่รับอาร์เรย์ดังกล่าวและส่งกลับบางส่วนของอาร์เรย์กลับตามที่แสดงในตัวอย่างด้านบน
วิธีที่ 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{ if(start <=end){ return partSumRecursively(arr, partSum.concat(sumRecursively() arr, start)), ++เริ่ม, สิ้นสุด); }; ส่งคืน partSum;};console.log(partSumRecursively(arr));
ผลลัพธ์
ผลลัพธ์ในคอนโซลสำหรับทั้งสองวิธีจะเป็น −
[ 41, 31, 26, 20, 8, 1 ]