從農夫養牛問題推廣到斐波那契數列

2021-06-22 18:32:41 字數 1950 閱讀 2238

乙個農夫養了一頭牛,三年後,這頭牛每年會生出1頭牛,生出來的牛三年後,又可以每年生出一頭牛……問農夫10年後有多少頭牛?n年呢?

這裡主要談一下解決這種問題的思想。首先可以聯絡斐波那契數列,設f(n)為第n年的牛,則

f(n) = f(n - 1) + f(n - 2)————>

表示式1-1

即第n年的牛為去年牛的個數f(n - 1)加上今年出生牛的個數,那麼今年有多少頭牛能生呢?(不考慮死亡的牛)則為前年牛的個數即f(n - 2),因為前年的牛今年至少3歲,即為表示式1-1。

推廣一下,將牛生育年齡設為m,那麼計算的表示式就變為

f(n) = f(n - 1) + f(n - m + 1)————>

表示式1-2

即n-1

年牛的個數加上n-m+1

年的牛生出的小牛。

那麼下面討論乙個稍微複雜點的問題,如果增加乙個條件,即牛會在第8年死去,那麼第n

年會有多少條牛呢?

為了便於推導,這裡先設幾個函式:

·         

f(n)

即第n年牛的個數

·         

h(n)

即第n年出生的牛的個數

·         

g(n)

即第n年死亡的牛的個數

那麼這裡可以首先想到乙個表示式:

(1)f(n) = f(n -1) + h(n) - g(n)

即第n年牛的個數為第n-1

年牛的個數+

第n年出生的牛的個數-

第n年死亡的牛的個數

而第二個表示式即關於新增牛的個數h(n)

的:(2)h(n) = f(n - 2) - g(n - 1)

即第n年出生的牛的個數為第n-2

年牛的個數減去在第n-1

年死亡的牛的個數

再看第三個表示式關於第n

年死亡的牛的個數的:

(3)g(n)=h(n - 7)

即第n年死亡的牛的個數為第n - 7

年出生的牛的個數,這是乙個對稱的關係。

推導的步驟如下,將(2)

代入(1)

即f(n) = f(n - 1) + f(n - 2)- g(n - 1) - g(n)---->(4)

再將(3)

式代入(4)

即f(n) = f(n - 1) + f(n - 2) - h(n - 8) - h(n - 7)----->(5)

再將(2

)式代入(5

)的h(n - 7)

即f(n) = f(n - 1) + f(n - 2) - (h(n - 8) + f(n - 9) - g(n - 8))

到了這裡不難看出(h(n - 8) + f(n - 9) - g(n - 8))

即為f(n - 8)

通過式(1)

。則最終的表示式為

f(n) = f(n - 1) + f(n - 2) - f(n - 8)

即第n年牛的個數為第n-1

年牛的個數+

第n-2

年牛的個數-

第n-8

年牛的個數

當牛的生育年齡用a

表示,死亡年齡用b

表示時,則表示為:

f(n) = f(n - 1) + f(n – a +

1) - f(n - b)

驗證程式如下:

using system;

namespace topcoder

:", i, sum);}}

}///

//////

///要計算的年限

///牛的生育年齡

///牛的死亡年齡

///public

int feed(int year, int age, int deadage)

return sum;}

原**:

//遞迴演算法和非遞迴演算法 以及解釋

斐波那契數

入門訓練 fibonacci數列 時間限制 1.0s 記憶體限制 256.0mb 問題描述 fibonacci數列的遞推公式為 fn fn 1 fn 2,其中f1 f2 1。當n比較大時,fn也非常大,現在我們想知道,fn除以10007的餘數是多少。輸入格式 輸入包含乙個整數n。輸出格式 輸出一行,...

斐波那契數

斐波那契數列 fibonacci sequence 簡介 斐波那契數列 fibonacci sequence 又稱 分割 數列 因 數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 ...

斐波那契數

遞迴演算法是不可取的。由於效率非常低,並且還有棧溢位的風險。應該使用例如以下的迭代解法 int fibonacci unsigned int n if n 1 int i 0,j 1,m unsigned int k for k 2 k n k return m 可是對於這題來說。上面的 還是不行的...