經典算法詳解(2):費氏數列

說明:

Fibonacci爲1200年代的歐洲數學家,在他的著作中曾經提到:若有一隻免子每個月生一隻小免子,一個月後小免子也開始生產。起初只有一隻免子,一個月後就有兩隻免子,二個月後有三隻免子,三個月後有五隻免子(小免子投入生產)......。 如果不太理解這個例子的話,舉個圖就知道了,注意新生的小免子需一個月成長期纔會投入生產,類似的道理也可以用於植物的生長,這就是Fibonacci數列,一般習慣稱之爲費氏數列,例如以下: 1、1 、2、3、5、8、13、21、34、55、89...... 

分析:

如果單從數學上找費氏數列的規律時,很容易發現當n>=2時,f(n)=f(n-1)+f(n-2)。但是如果從邏輯上分析,爲什麼會有這個規律呢?其實很簡單,由於第n個月的兔子=上一個月的兔子數量+這個月新出生的兔子數量。上一個月的兔子的數量爲f(n-1),那這個月新生出的兔子數量是多少呢,那就是上上個月的兔子的數量,因爲只有在上上個月就已經存在的兔子,這個月才能生兔子,因此新出生的兔子的數量就是f(n-2)。

實現:

/****************************************************************
 Name: GossipAlgorithm.c
 Description: the problem is a classical recursion problem
 Author: [email protected]
 Time: 2014-9-12
****************************************************************/

 #include <stdio.h>

 const int MAX_SIZE=20;
 int main()
 {
 	int arrayGossip[MAX_SIZE]; 
	arrayGossip[0]=0; /** the first element of array is 0 */
	arrayGossip[1]=1;
	for(int i=2;i<MAX_SIZE;i++)
	{
		arrayGossip[i]=arrayGossip[i-1]+arrayGossip[i-2];
	}
	for(int i=0;i<MAX_SIZE;i++)
	{
		printf("%d\n",arrayGossip[i]);
	}
	return 0; 
 }

總結:

費氏數列從數學上很容易找出它的規律,但是如果要從邏輯上理解,就得稍微思考一下了。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章