斐波納契(Fibonacci)數列:算法
0, 1, 1, 2, 3, 5, 8, 13, 21…函數
以0和1開始,而且後面的每一個斐波納契數是前兩個斐波納契數之和。字體
斐波納契數列能夠遞歸定義:spa
Fibonacci(0)= 0遞歸
Fibonacci(1)= 1ci
Fibonacci(n)= Fibonacci(n-1) + Fibonacci(n-2)table
使用遞歸算法的Java代碼以下:ast
public long fibonacci(long n)im
{img
if(n==0||n==1)
return n;
else
return fibonacci(n-1) + fibonacci(n-2);
}
在這裏有個有趣的問題:
假如計算fibonacci(3)時,會產生2個遞歸調用; fibonacci(2)和fibonacci(1)以下圖:
進行簡化以下:
從上圖中能夠清楚的看到使用遞歸算法計算fibonacci(3)一共進行了5次遞歸調用;
那麼計算fibonacci(20)、fibonacci(30)、…又要遞歸多少次呢?
假如計算fibonacci(31)須要調用4356617次,計算fibonacci(32)須要7049155次,能夠看出遞歸計算斐波那契數列,對函數的調用是爆炸式的,相鄰的第31和32個斐波那契數就增加了664080次。
n |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
fibonacci(n) |
0 |
1 |
1 |
2 |
3 |
5 |
8 |
13 |
21 |
34 |
那麼再列出fibonacci(4)的圖
一共調用5+3+1=9次
n |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
fibonacci(n) |
0 |
1 |
1 |
2 |
3 6 |
5 19 |
8 |
13 |
21 |
34 |
次數count(n) |
1 |
1 |
3 |
5 |
9 |
15 |
25 |
41 |
67 |
109 |
紅色字體爲調用次數與計算fibonacci(n)的值之差。
能夠獲得差值和調用次數分別遵循以下斐波那契函數:
差值:
Difference (0) = 1
Difference (1) = 0
Difference (n) = Difference (n-1) + Difference (n-2) + 1
調用次數;
Count (0) = 1
Count (1) = 1
Count (n) = Count (n-1) + Count (n-2) + 1