เหตุใดรุ่นซ้ำ ๆ จึงใช้เวลานานกว่า


11

ฉันดูที่http://programming.lispdream.com/blog/2011/06/recursion-vs-iteration/และฉันเห็นว่าการใช้งานแบบเรียกซ้ำและทำซ้ำของฟังก์ชันแฟคทอเรียลซ้ำแล้วซ้ำอีกจะใช้เวลานานกว่า รับ n = 1,000 ฉันไม่สามารถหาสาเหตุ (เขาไม่ได้อธิบาย แต่บอกว่ามันเป็นแบบฝึกหัดสำหรับผู้อ่าน) ขออภัยสำหรับความแปลกใหม่ของฉันทั้งหมดนี้

คำตอบ:


10

โปรแกรมสองโปรแกรมนั้นไม่เทียบเท่ากัน เวอร์ชันเรียกซ้ำกำลังคำนวณ

(... ((1 * 2) * 3) * 4 ... * n)

ในขณะที่ซ้ำคือการคำนวณ

(... ((n * (n-1)) * (n-2) ... * 1)

ดังนั้นปริมาณกลางจะเพิ่มขึ้นอย่างรวดเร็วสำหรับรุ่นซ้ำและการคำนวณตัวเลขใหญ่นั้นเร็วขึ้นเมื่อตัวเลขที่เกี่ยวข้องมีขนาดเล็ก (คำนวณ 1,000! โดยไม่มีตัวเลขใหญ่ไม่มีความรู้สึก


1

เมื่อคุณทำการวนซ้ำอัลกอริทึมซ้ำคุณต้องใช้กองซ้อนที่ติดตามผลลัพธ์อย่างชัดเจน การกระทำนี้จะเพิ่มการดำเนินงานพิเศษที่เกี่ยวข้องกับการผลักดันและ popping สแต็กที่อัลกอริทึมแบบเรียกใช้ซ้ำได้รับฟรี


1
คุณดูรายการหรือไม่ แฟคทอเรียลแบบวนซ้ำไม่ได้จัดการสแต็กเลย
AProgrammer

-1

ฉันเดาได้ แต่ฉันไม่แน่ใจว่ามาตรฐานนั้นมาจาก C หรือจากรหัส SBLC ฉันเดาว่าผู้ร้ายกำลังกลายพันธุ์ตัวแปร 1000! เป็นจำนวนที่ค่อนข้างใหญ่บางทีมันจะเร็วกว่าในการเติมสแต็กด้วย intermidiaries และล้างข้อมูลมากกว่าสร้างสำเนาและเขียนทับ


เหล่านั้นมาจากรหัส SBCL ฉันคิดว่า
martinjacobd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.