Urutan Fibbonacci adalah urutan yang menjumlahkan hasil angka ketika ditambahkan ke hasil sebelumnya dimulai dengan 1.
so.. 1 + 1 = 2
2 + 3 = 5
3 + 5 = 8
5 + 8 = 13
8 + 13 = 21
Setelah kita memahami apa itu Fibbonacci, kita dapat mulai memecah kode.
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 if pertama memeriksa case dasar, di mana loop dapat keluar. Lain lagi jika pernyataan di bawah ini melakukan hal yang sama, tetapi bisa ditulis ulang seperti itu ...
public int fibonacci(int n) {
if(n < 2)
return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
Sekarang setelah kasus dasar ditetapkan, kita harus memahami tumpukan panggilan. Panggilan pertama Anda ke "fibonacci" akan menjadi yang terakhir untuk diselesaikan pada tumpukan (urutan panggilan) karena mereka menyelesaikan dalam urutan terbalik dari mana mereka dipanggil. Metode terakhir yang disebut resolves terlebih dahulu, lalu yang terakhir dipanggil sebelum itu dan seterusnya ...
Jadi, semua panggilan dilakukan terlebih dahulu sebelum semuanya "dihitung" dengan hasil tersebut. Dengan input 8, kami mengharapkan output 21 (lihat tabel di atas).
fibonacci (n - 1) terus dipanggil hingga mencapai base case, kemudian fibonacci (n - 2) dipanggil hingga mencapai base case. Ketika tumpukan mulai menjumlahkan hasil dalam urutan terbalik, hasilnya akan seperti ...
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).
Mereka terus menggelegak (menyelesaikan mundur) hingga jumlah yang benar dikembalikan ke panggilan pertama di tumpukan dan itulah cara Anda mendapatkan jawaban Anda.
Karena itu, algoritma ini sangat tidak efisien karena menghitung hasil yang sama untuk setiap cabang yang dipecah dengan kode. Pendekatan yang jauh lebih baik adalah pendekatan "bottom-up" di mana tidak diperlukan Memoisasi (caching) atau rekursi (tumpukan panggilan yang mendalam).
Seperti ...
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;
}