Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

Prefix sums (การสร้างอาร์เรย์ด้วยผลรวมที่เพิ่มขึ้น) ด้วย Recursion ใน 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 ]

เราจำเป็นต้องเขียนฟังก์ชันที่รับอาร์เรย์ดังกล่าวและส่งกลับบางส่วนของอาร์เรย์กลับตามที่แสดงในตัวอย่างด้านบน

วิธีที่ 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 ]