หากคุณเพียงแค่ต้องการเพิ่มความเร็วอัลกอริทึมแบบเรียกซ้ำของคุณการมีส่วนร่วมอาจเพียงพอ นี่เป็นเทคนิคการเก็บผลลัพธ์ของการเรียกใช้ฟังก์ชันเพื่อให้การโทรในอนาคตด้วยพารามิเตอร์เดียวกันสามารถนำผลลัพธ์มาใช้ใหม่ได้ สิ่งนี้ใช้ได้หาก (และเฉพาะในกรณี) ฟังก์ชั่นของคุณ
- ไม่มีผลข้างเคียงและ
- จะขึ้นอยู่กับพารามิเตอร์เท่านั้น (เช่นไม่ได้อยู่ในบางสถานะ)
มันจะช่วยให้คุณประหยัดเวลาถ้า (และถ้าหาก) ฟังก์ชั่นถูกเรียกด้วยพารามิเตอร์เดียวกันซ้ำแล้วซ้ำอีก ตัวอย่างที่ได้รับความนิยม ได้แก่ นิยามแบบเรียกซ้ำของตัวเลขฟีโบนักชีนั่นคือ
f(0)f(1)f(n+2)=0=1=f(n+1)+f(n), n≥0
ff(n)f(n+1)
โปรดทราบว่าในทางกลับกันการบันทึกข้อมูลนั้นไม่มีประโยชน์สำหรับอัลกอริธึมเช่นการเรียงแบบผสาน: โดยปกติรายการบางส่วนจะมีจำนวนเท่ากัน (ถ้ามี) และการตรวจสอบความเท่าเทียมกันนั้นมีราคาแพง (การเรียงลำดับ
ในการนำไปใช้งานจริงวิธีที่คุณเก็บผลลัพธ์นั้นมีการนำเข้าสู่ประสิทธิภาพอย่างยอดเยี่ยม การใช้ตารางแฮชอาจเป็นตัวเลือกที่ชัดเจน แต่อาจทำให้สถานที่แตกหัก หากพารามิเตอร์ของคุณไม่ใช่จำนวนเต็มแบบลบอาร์เรย์เป็นตัวเลือกที่เป็นธรรมชาติ แต่อาจทำให้เกิดค่าใช้จ่ายหน่วยความจำขนาดใหญ่หากคุณใช้เพียงบางรายการ ดังนั้นการบันทึกคือการแลกเปลี่ยนระหว่างผลกระทบและต้นทุน การจ่ายเงินนั้นขึ้นอยู่กับสถานการณ์เฉพาะของคุณหรือไม่
การเขียนโปรแกรมแบบไดนามิกเป็นสัตว์ร้ายอย่างสมบูรณ์ มันใช้ได้กับปัญหากับสถานที่นั้น ๆ
- มันสามารถแบ่งเป็นปัญหาย่อย (อาจมีมากกว่าหนึ่งวิธี)
- ปัญหาย่อยเหล่านั้นสามารถแก้ไขได้อย่างอิสระ
- การแก้ปัญหา (ดีที่สุด) ของปัญหาย่อยเหล่านั้นสามารถรวมเข้ากับการแก้ปัญหาที่เหมาะสมที่สุดของปัญหาดั้งเดิมและ
- ปัญหาย่อยมีคุณสมบัติเดียวกัน (หรือไม่สำคัญ)
นี้มักจะ (โดยปริยาย) โดยนัยเมื่อมีคนเรียกยามของหลักการ optimality
ทีนี้นี่เป็นเพียงการอธิบายปัญหาที่สามารถอธิบายได้ด้วยการเรียกซ้ำบางประเภท การประเมินผลเหล่านั้น (มัก) มีประสิทธิภาพเพราะสามารถนำไปใช้กับผลกระทบที่ดี (ดูด้านบน); โดยปกติปัญหาย่อยที่เล็กกว่าจะเกิดขึ้นเป็นส่วนหนึ่งของปัญหาที่ใหญ่กว่า ตัวอย่างที่นิยม ได้แก่การแก้ไขระยะทางและอัลกอริทึม Bellman ฟอร์ด