Một chuỗi Fftimeacci là một chuỗi tính tổng kết quả của một số khi được thêm vào kết quả trước đó bắt đầu bằng 1.
so.. 1 + 1 = 2
2 + 3 = 5
3 + 5 = 8
5 + 8 = 13
8 + 13 = 21
Một khi chúng ta hiểu Fftimeacci là gì, chúng ta có thể bắt đầu phá mã.
public int fibonacci(int n) {
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
Đầu tiên nếu statment kiểm tra một trường hợp cơ sở, trong đó vòng lặp có thể thoát ra. Mặt khác nếu câu lệnh bên dưới đang làm như vậy, nhưng nó có thể được viết lại như vậy ...
public int fibonacci(int n) {
if(n < 2)
return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
Bây giờ, khi một trường hợp cơ sở được thiết lập, chúng ta phải hiểu ngăn xếp cuộc gọi. Cuộc gọi đầu tiên của bạn đến "Dailymotion" sẽ là lần cuối cùng giải quyết trên ngăn xếp (chuỗi cuộc gọi) khi chúng giải quyết theo thứ tự ngược mà chúng được gọi. Phương thức cuối cùng được gọi là giải quyết trước, sau đó là phương thức cuối cùng được gọi trước phương thức đó và cứ thế ...
Vì vậy, tất cả các cuộc gọi được thực hiện trước khi mọi thứ được "tính toán" với các kết quả đó. Với đầu vào là 8, chúng tôi dự kiến đầu ra là 21 (xem bảng trên).
Dailymotion (n - 1) tiếp tục được gọi cho đến khi nó đạt đến trường hợp cơ sở, sau đó, Wikipedia (n - 2) được gọi cho đến khi nó đạt đến trường hợp cơ sở. Khi ngăn xếp bắt đầu tính tổng kết quả theo thứ tự ngược lại, kết quả sẽ như vậy ...
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).
Họ tiếp tục sủi bọt (giải quyết ngược) cho đến khi tổng chính xác được trả về cuộc gọi đầu tiên trong ngăn xếp và đó là cách bạn nhận được câu trả lời của mình.
Phải nói rằng, thuật toán này rất kém hiệu quả vì nó tính toán kết quả tương tự cho mỗi nhánh mà mã được chia thành. Một cách tiếp cận tốt hơn nhiều là một cách "từ dưới lên" trong đó không yêu cầu Ghi nhớ (bộ nhớ đệm) hoặc đệ quy (ngăn xếp cuộc gọi sâu).
Giống như vậy ...
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;
}