c語言資料結構遞迴之斐波那契數列
因為自己對遞迴還是不太熟練,於是做poj1753的時候就很吃力,就是翻棋子直到棋盤上所caextekl有棋子的顏色一樣為止,求最少翻多少次,方法是列舉遞迴。然後就打算先做另一道遞迴的題(從陣列中取出n個元素的組合),但是同樣在遞迴的問題上不太理解。好吧,於是複習cpp,在第229頁的時候,看到了斐波那契數列,回想起之前做過的一道題目,發現可以用遞迴的方法來做。於是決定優化一下之前的**。
以下這段摘自《c primer plus》
斐波那契數列的定義如下:第乙個和第二個數字都是1,而後續的每個數字是其前兩個數字之和,例如,數列中前幾個數字是1,1,2,3,5,8和13。…下面我們建立乙個函式,它接受乙個正整數n作為引數,返回相應的斐波那契數值。
首先,關於遞迴深度,遞迴提供了乙個簡單的定義。如果呼叫fibonacci(),當n為1或2時fibonacci(n)應返回1;對於其他數值應返回fibonacci(n-1)+fibonacci(n-2);
long fibonacci(n)
然後是兔子總數問題。
有一對兔子,從出生後第三個月起每個月都生一對兔子,小兔子長到第三個月後又生一對兔子,假如兔子都不死,每個月兔子對數為多少?
思考這道題的時候,如果你簡單的推算一下,會發現兔子每個月的對數就是斐波那契數列。
第程式設計客棧乙個月:1對;
第二個月:1對;
第三個月:2對;
第四個月:3對:
第五個月:5對:
第六個月:8對;
…… 我之前做這道題的時候,覺得思路很簡單,就是從第三個月起,求每個月的兔子數時,只要把這個月的前兩個月總數相加。
這是我之前的**,用f1和f2表示月。:
#include
int main()
if (month %2 == 0)
if (month %2 == 1)
} return 0;
}其實這個**離遞迴就差一步,很接近了。但是我當時完全沒有想到。
這是我重新修改之後的**:
#include
long fibonacci(n)
int main()
只是很簡單的修改,但是**就整潔易懂了很多,也學到了新內容。
工欲善其事必先利其器,共勉。
本文標題: c語言資料結構遞迴之斐波那契數列
本文位址:
斐波那契數列之遞迴
斐波那契數列,又稱 分割數列,指的是這樣乙個數列 0 1 1 2 3 5 8 13 21 在數學上,斐波納契數列以如下被以遞迴的方法定義 f0 0,f1 1,fn f n 1 f n 2 n 2,n n 斐波那契數列最初是為了計算兔子的出生數量而出現的,所以也叫 兔子數列 遞迴的本質其實程式的方法自...
用遞迴求斐波那契數
斐波那契數是第乙個數和第二個數都為1,從第三個數開始,後面的是是前面相鄰兩個數的和。定義的函式如下所示 int fib int m if語句為了確定第一位和第二位都為1,完整的 如下所示 include include int fib int m int main printf n printf n...
斐波那契數 c 語言實現
斐波那契數列,又稱 數列,指的是這樣乙個數列 1 1 2 3 5 8 13 21 在數學上,斐波納契數列以如下被以遞迴的方法定義 f 1 1,f 2 1,f n f n 1 f n 2 n 2,n n 第一種實現方法可以通過其定義得知 遞迴 int fib2 int num 第二種方法 迭代 int...