乙個農夫養了一頭牛,三年後,這頭牛每年會生出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 可是對於這題來說。上面的 還是不行的...