2009年12月28日 星期一

奇妙的費氏數列和C++的解法

小傢伙要我看看費氏數列的C++程式怎麼寫…
我想她只是丟個事給我這無聊老頭作作,免得我老人吃呆了,她要提早退休照顧我…哈哈
(就跟丟一根骨頭給一隻老狗玩玩,隨意打發一下…)
為什麼我這麼說呢,因為很多C的書都有這類範例,只要肯上圖書館,甚至肯在Google 上用對了關鍵字去「咕狗」一下,一定可以找到不同解法…
所以,她問我這題一定只是隨便應付我一下而已…我想…
另外一個可能是,她創造力太豐富,不想看別人的解法,想自己兜兜看…

好了,先「咕狗」一下「費氏數列」,在有水準(所以比較可靠)的維基百科上看到定義,以及說明,雖是只是大略的瞄了一下,不禁肅然起敬,真是簡潔完美…各位可以參考如下 維基百科中文-費氏數列 英文的更棒,還有螺旋圖呢
  • F0 = 0
  • F1 = 1
  • Fn = Fn - 1 + Fn - 2

由上三式簡單關係,可知若要以迴圈來解,應該是先把第零、第一項先寫好,再用第三式來寫迴圈。因為,每次迴圈都需要前兩項,所以,第一個迴圈必須由F2開始。迴圈無法處理n=0,或n=1的狀況,它們要由特例來處理。

下面是第一個嘗試,前面的#include省略不列,主要試的是咖啡色的判斷結構,看能不能正確的把第0,第1項和其餘的分開。

int main()

{

int n,f;

printf("Input n to find fab# :");

scanf("%d",&n);

if (n==0){ f=0; }

else if (n==1){ f=1; }

else {f=999;}

printf("Fibonacci #= %d \n",f);

system("PAUSE");

return EXIT_SUCCESS;

}



下面這程式就在「其餘的」部份,架起迴圈。(我把頭、尾省掉了)

int n, f, f_2, f_1, i;

/* f=費氏數 Fn ,

f_1=費氏數之前一項 Fn-1 ,

f_2=費氏數之前2 Fn-2 ,*/

printf("Input n to find fab# :");

scanf("%d",&n);

f_2=0; f_1=1;

if (n==0){ f=f_2; }

else if (n==1){ f=f_1; }

else {

for (i=2;i<=n;i++){

f=f_2+f_1;

f_2=f_1;

f_1=f;

}

}

printf("Fibonacci #= %d \n",f);



在課本中,有一累似的解法,它寫成函式,將來更好叫用。不過,n=0時,答案可能不一樣?

#include

#include

int f(int); //計算費氏數列

int main(void)

{

int n;

printf("Input n:");

scanf("%d",&n);

printf("f(%d) = %d\n",n,f(n));

system("pause"); //使程式暫停在執行畫面讓我們看到結果

}

int f(int n)

{

int i,sum,pre,fi;

pre = 0;

fi = 1;

for(i=1;i

sum = pre + fi; //加出下一項

pre = fi; //紀錄前一項

fi = sum; //i

}

return fi;

}

沒有留言:

張貼留言