การทำความเข้าใจการทับซ้ำและสูตร recursive

การย้ำ

Iteration คือการทำซ้ำของกระบวนการ นักเรียนที่ไปโรงเรียนจะทำซ้ำขั้นตอนการไปโรงเรียนทุกวันจนกว่าจะสำเร็จการศึกษา เราไปที่ร้านขายของชำอย่างน้อยหนึ่งครั้งหรือสองครั้งต่อเดือนเพื่อซื้อผลิตภัณฑ์ เราทำซ้ำขั้นตอนนี้ทุกเดือน ในวิชาคณิตศาสตร์ลำดับ Fibonacci เป็นไปตามคุณสมบัติของการทำซ้ำของงานเช่นกัน ลองพิจารณาลำดับ Fibonacci ที่สองหมายเลขแรกคือ 0 และ 1 ตัวเลขอื่น ๆ ทั้งหมดเป็นผลรวมของตัวเลขสองตัวก่อนหน้านี้

0 1 1 2 3 5 8 13 21 34 55 89

Iteration Steps

สูตร Fibonacci สามารถเขียนเป็น,

F (n) = F (n - 1) + F (n - 2)
fibonacci (0) = 0
fibonacci (1) = 1
fibonacci (2) = fibonacci (1) + fibonacci (0) = 1 + 0 = 1
fibonacci (3) = fibonacci (2) + fibonacci (1) = 1 + 1 = 2
fibonacci (4) = fibonacci (3) + fibonacci (2) = 2 + 1 = 3
fibonacci (5) = fibonacci (4) + fibonacci (3) = 3 + 2 = 5
fibonacci (6) = fibonacci (5) + fibonacci (4) = 5 + 3 = 8

อัลกอริทึ่มที่ให้ไว้ด้านล่างนี้จะส่งกลับจำนวน Fibonacci nth

recursion

ทุกครั้งที่เราได้รับหมายเลข Fibonacci ใหม่ (nth number) ว่าหมายเลขที่ n เป็นจริงหมายเลข (n - 1) th เมื่อเราพบ (n +1) th Fibonacci เป็น Fibonacci n ถัดไปของเรา ตามที่เราเห็นขั้นตอนการกล่าวซ้ำข้างต้น: ถ้า n = 2 แล้ว
(2) = fibonacci (2 - 1) + fibonacci (2 - 2) = fibonacci (1) + fibonacci (0) = 1 + 0 = 1

ตอนนี้เราต้องการสร้าง fibonacci (3) นั่นคือ n = 3

(3) = fibonacci (3 - 1) + fibonacci (3 - 2) = fibonacci (2) + fibonacci (1) = 1 + 1 = 2
นั่นหมายความว่าแต่ละครั้ง n จะเพิ่มค่าของกระแส (n - 1) th และ (n - 2) นอกจากนี้ fibonacci ยังเพิ่มขึ้น แต่น่าเบื่อที่จะติดตาม (n - 1) th และ (n - 2) th fibonacci สำหรับแต่ละ n วิธีการเกี่ยวกับการเขียนวิธีการที่เรียกตัวเองเพื่อทำซ้ำงานของตัวซ้ำด้วยตัวเอง?

วิธีการที่เรียกตัวเองมีชื่อเป็นวิธีการเวียนเกิด วิธีการเวียนเกิดจะต้องมีกรณีฐานที่โปรแกรมหยุดเรียกตัวเอง กรณีพื้นฐานของเราสำหรับ Fibonacci คือ fibonacci (0) = 0 และ fibonacci (1) = 1. มิฉะนั้นวิธี Fibonacci จะเรียกตัวเองสองครั้ง - fibonacci (n - 1) และ fibonacci (n - 2). จากนั้นจะเพิ่มพวกเขาเพื่อรับ fibonacci (n) วิธีการเวียนเกิดสำหรับการหา nib Fibonacci สามารถเขียนเป็น -

PRO TIP: หากปัญหาเกิดขึ้นกับคอมพิวเตอร์หรือแล็ปท็อป / โน้ตบุ๊คคุณควรลองใช้ซอฟต์แวร์ Reimage Plus ซึ่งสามารถสแกนที่เก็บข้อมูลและแทนที่ไฟล์ที่เสียหายได้ วิธีนี้ใช้ได้ผลในกรณีส่วนใหญ่เนื่องจากปัญหาเกิดจากความเสียหายของระบบ คุณสามารถดาวน์โหลด Reimage Plus โดยคลิกที่นี่

ถ้าเรามองอย่างรอบคอบการเรียกซ้ำตามสมบัติของ stack จะแก้ปัญหาเล็ก ๆ เพื่อแก้ปัญหา สำหรับ n> 1 จะรันบรรทัดสุดท้าย ดังนั้นถ้า n = 6 ฟังก์ชันจะเรียกและเพิ่ม fibonacci (6 - 1) และ fibonacci (6 - 2) fibonacci (6 - 1) หรือ fibonacci (5) เรียกและเพิ่ม fibonacci (5 - 1) และ fibonacci (5 - 2). recursion นี้ยังคงดำเนินต่อไปจนถึง 6 ถึงค่าของ base case ซึ่งคือ fibonacci (0) = 0 หรือ fibonacci (1) = 1. เมื่อ hits ฐานกรณีมันจะเพิ่มสองค่าพื้นฐานและขึ้นไปจนได้รับค่าของ fibonacci ( 6) ด้านล่างนี้เป็นตัวแทนของการทับทิมต้นไม้

recursion Tree

อย่างที่เราเห็นจะมีประสิทธิภาพเท่าไร เฉพาะบรรทัดเดียวของรหัสจะทำให้ต้นไม้ด้านบน (บรรทัดสุดท้ายของโค้ดด้านบนรวมถึงกรณีฐาน) การทวนซ้ำจะเก็บสแต็กไว้และจะไปถึงส่วนลึกจนกว่าจะถึงฐาน การเขียนโปรแกรมแบบไดนามิก (Dynamic Programming (DP)): การทวนซ้ำเป็นเรื่องง่ายที่จะเข้าใจและใช้รหัส แต่อาจมีราคาแพงในแง่ของเวลาและหน่วยความจำ ลองดูที่ต้นไม้ recursion ด้านล่าง ทรีย่อยด้านซ้ายที่ขึ้นต้นด้วย fib (4) และทรีย่อยขวาที่ขึ้นต้นด้วย fib (4) จะเหมือนกัน พวกเขาสร้างผลเช่นเดียวกันซึ่งเป็น 3 แต่กำลังทำงานเดียวกันสองครั้ง ถ้า n เป็นจำนวนมาก (เช่น 500000) การเรียกซ้ำอาจทำให้โปรแกรมทำงานช้ามากเนื่องจากจะเรียกซ้ำงานย่อยหลาย ๆ ครั้ง

recursion ต้นไม้วงกลม

เพื่อหลีกเลี่ยงปัญหานี้โปรแกรมไดนามิกสามารถใช้ ในโปรแกรมแบบไดนามิกเราสามารถใช้การแก้ปัญหาที่แก้ไขแล้วก่อนหน้านี้เพื่อแก้ปัญหาในอนาคตของประเภทเดียวกัน นี่เป็นวิธีลดงานในการแก้ปัญหาเดิม ขอมีอาร์เรย์อาร์เรย์ [] ที่เราเก็บโซลูชันที่ระบุไว้ก่อนหน้านี้ที่แก้ไขแล้ว เรารู้อยู่แล้วว่า fib [0] = 0 และ fib [1] = 1. ลองเก็บค่าทั้งสองค่านี้ไว้ ตอนนี้สิ่งที่เป็นค่าของ fib [2]? เป็น fib [0] = 0 และ fib [1] = 1 ได้รับการเก็บไว้แล้วเราก็ต้องพูด fib [2] = fib [1] + fib [0] และนั่นคือทั้งหมด เราสามารถสร้าง fib [3], fib [4], fib [5],, fib [n] ในลักษณะเดียวกัน งานย่อยย่อยที่ได้รับการแก้ไขก่อนหน้านี้กำลังถูกเรียกเพื่อให้ได้งานย่อยต่อไปจนกว่างานต้นฉบับจะไม่ได้รับการแก้ไขจึงช่วยลดการคำนวณซ้ำซ้อน

PRO TIP: หากปัญหาเกิดขึ้นกับคอมพิวเตอร์หรือแล็ปท็อป / โน้ตบุ๊คคุณควรลองใช้ซอฟต์แวร์ Reimage Plus ซึ่งสามารถสแกนที่เก็บข้อมูลและแทนที่ไฟล์ที่เสียหายได้ วิธีนี้ใช้ได้ผลในกรณีส่วนใหญ่เนื่องจากปัญหาเกิดจากความเสียหายของระบบ คุณสามารถดาวน์โหลด Reimage Plus โดยคลิกที่นี่

Facebook Twitter Google Plus Pinterest