ลำดับ Fibbonacci คือลำดับที่รวมผลลัพธ์ของตัวเลขเมื่อบวกกับผลลัพธ์ก่อนหน้าโดยเริ่มต้นด้วย 1
so.. 1 + 1 = 2
2 + 3 = 5
3 + 5 = 8
5 + 8 = 13
8 + 13 = 21
เมื่อเราเข้าใจว่า Fibbonacci คืออะไรเราสามารถเริ่มทำลายรหัสได้
public int fibonacci(int n) {
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
ครั้งแรกถ้า statment ตรวจสอบกรณีฐานที่วงสามารถแบ่งออก คำสั่งอื่นด้านล่างถ้าทำเช่นเดียวกัน แต่สามารถเขียนซ้ำได้เช่นนั้น ...
public int fibonacci(int n) {
if(n < 2)
return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
ตอนนี้กรณีพื้นฐานคือการสร้างเราต้องเข้าใจ call stack การโทรครั้งแรกของคุณไปที่ "fibonacci" จะเป็นครั้งสุดท้ายที่จะแก้ไขใน stack (ลำดับการโทร) ตามที่พวกเขาแก้ไขในลำดับย้อนกลับที่พวกเขาถูกเรียก วิธีสุดท้ายที่เรียกว่าแก้ไขก่อนแล้วจึงถูกเรียกก่อนหน้านั้นก่อนและต่อ ...
ดังนั้นการโทรทั้งหมดจะถูกทำก่อนสิ่งใด ๆ ที่ "คำนวณ" กับผลลัพธ์เหล่านั้น ด้วยอินพุต 8 เราคาดหวังผลลัพธ์ที่ 21 (ดูตารางด้านบน)
ฟีโบนักชี (n - 1) ยังคงถูกเรียกจนกว่าจะถึงเคสฐานจากนั้นฟีโบนักชี (n - 2) จะถูกเรียกจนกว่าจะถึงเคสพื้นฐาน เมื่อสแต็คเริ่มรวมผลลัพธ์ในลำดับย้อนกลับผลลัพธ์จะเป็นเช่นนั้น ...
1 + 1 = 1 ---- last call of the stack (hits a base case).
2 + 1 = 3 ---- Next level of the stack (resolving backwards).
2 + 3 = 5 ---- Next level of the stack (continuing to resolve).
พวกเขายังคงเดือดปุด ๆ (แก้ไขไปข้างหลัง) จนถึงผลรวมที่ถูกต้องจะถูกส่งกลับไปที่สายแรกในสแต็คและนั่นคือวิธีที่คุณได้รับคำตอบ
ต้องบอกว่าอัลกอริทึมนี้ไม่มีประสิทธิภาพมากเพราะจะคำนวณผลลัพธ์เดียวกันสำหรับแต่ละสาขาที่รหัสแยกออกเป็น วิธีที่ดีกว่าคือ "ด้านล่าง" ที่ไม่ต้องมีการบันทึก (แคช) หรือการเรียกซ้ำ (call call stack) ที่ลึก
ชอบมาก ...
static int BottomUpFib(int current)
{
if (current < 2) return current;
int fib = 1;
int last = 1;
for (int i = 2; i < current; i++)
{
int temp = fib;
fib += last;
last = temp;
}
return fib;
}