斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契以兔子繁殖爲例子而引入,故又稱爲“兔子數列”。
斐波那契數列指的是這樣一個數列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657 。特別指出:第0項是0,第1項是第一個1。這個數列從第2項開始,每一項都等於前兩項之和。
Fibonacci數列的數學表達式就是:
F(n) = F(n-1) + F(n-2)
F(1) = 1
F(2) = 1
遞歸算法:
int fib(int n)
{
int last = 0;
int sum = 1;
if (n <= 2)
{
return 1;
}
else
{
return fib(n - 1) + fib(n - 2);
}
}
顯然這個算法時間複雜度爲O((3/2)^N) 是以指數增長的算法,基本上是最壞的情況。
其實,這違反了遞歸的一個規則:合成效益法則。
合成效益法則(Compound interest rule):在求解一個問題的同一實例的時候,切勿在不同的遞歸調用中做重複性的工作。
所以在上面的代碼中調用fib(N-1)的時候實際上同時計算了fib(N-2)。這種小的重複計算在遞歸過程中就會產生巨大的運行時間。
//迭代算法
int fib(int n)
{
int last = 0;
int sum = 1;
for (int i = 0; i <= n;i++)
{
int temp = sum;
sum = sum + last;
last = temp;
}
return sum;
}