Sekwencja Fibbonacciego to taka, która sumuje wynik liczby po dodaniu do poprzedniego wyniku, zaczynając od 1.
so.. 1 + 1 = 2
2 + 3 = 5
3 + 5 = 8
5 + 8 = 13
8 + 13 = 21
Gdy zrozumiemy, czym jest Fibbonacci, możemy zacząć rozkładać kod.
public int fibonacci(int n) {
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
Pierwsza instrukcja if sprawdza przypadek podstawowy, w którym może dojść do przerwania pętli. Poniższe oświadczenie else if robi to samo, ale można je przepisać w ten sposób ...
public int fibonacci(int n) {
if(n < 2)
return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
Teraz, gdy jest ustalony przypadek podstawowy, musimy zrozumieć stos wywołań. Twoje pierwsze wywołanie „fibonacci” będzie ostatnim, które zostanie rozstrzygnięte na stosie (sekwencja wywołań), ponieważ są one rozstrzygane w odwrotnej kolejności, z której zostały wywołane. Ostatnia wywoływana metoda jest najpierw rozwiązywana, potem ostatnia, która ma zostać wywołana przed nią i tak dalej ...
Tak więc wszystkie wywołania są wykonywane jako pierwsze, zanim cokolwiek zostanie „obliczone” na podstawie tych wyników. Przy wejściu 8 oczekujemy wyjścia 21 (patrz tabela powyżej).
Fibonacci (n - 1) jest wywoływana aż do przypadku podstawowego, a następnie Fibonacci (n - 2) jest wywoływana, aż osiągnie przypadek podstawowy. Kiedy stos zacznie sumować wynik w odwrotnej kolejności, wynik będzie taki ...
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).
Ciągle bulgoczą (rozstrzygając wstecz) aż do momentu, gdy właściwa suma zostanie zwrócona do pierwszego sprawdzenia w stosie i w ten sposób otrzymasz odpowiedź.
Mimo to algorytm ten jest bardzo nieefektywny, ponieważ oblicza ten sam wynik dla każdej gałęzi, na którą dzieli się kod. Znacznie lepszym podejściem jest podejście „oddolne”, w którym nie jest wymagane zapamiętywanie (buforowanie) ani rekursja (głęboki stos wywołań).
Tak jak tak ...
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;
}