斐波那契數列

斐波那契數列(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)。這種小的重複計算在遞歸過程中就會產生巨大的運行時間。


非遞歸迭代算法(時間複雜度O(N))
//迭代算法
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;
	
}


發佈了30 篇原創文章 · 獲贊 27 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章