【ROSALIND】【練Python,學生信】11 斐波那契數(shù)列與兔子繁殖問題之會死的兔子

如果第一次閱讀本系列文檔請先移步閱讀【ROSALIND】【練Python,學生信】00 寫在前面 ?謝謝配合~

題目:
根據(jù)斐波那契數(shù)列計算兔子的繁殖情況,兔子會死亡
Given: Positive integers n<100 and m<20.
所給:正整數(shù)n和m,n<100,m<20。
Return: The total number of pairs of rabbits that will remain after the n-th month if all rabbits live for m months.
需得:經(jīng)過n個月后共有多少對兔子,假設兔子的壽命為m個月。
?
測試數(shù)據(jù)
6 3
測試輸出
4
?
背景
斐波那契數(shù)列是以兔子繁殖為例子引入的數(shù)學式,推導中滿足的假設如下:
1.?????? 第一個月有一對新生兔子
2.?????? 出生后兔子需要再長一個月才可以繁殖,且之后每個月都會繁殖
3.?????? 每個月每對成年兔子可以生出一對小兔子
4.?????? 兔子都不會死,也不會停止繁殖
斐波那契數(shù)列體現(xiàn)了遞推的思想,滿足公式? ? ? ? ? ? ? ? ? ?

? ? ? ?自然界中很多現(xiàn)象體現(xiàn)斐波那契數(shù)列,如花瓣、莖葉排列等,在物理、化學等領(lǐng)域也多有應用。
?
思路
與原始的斐波那契數(shù)列相比,本題的變化是兔子經(jīng)過一定時間后會死亡,如下圖圖示:

圖中兔子只能活三個月,因此每個月需要減去三個月前出生的兔子。我以兔子開始死亡的第四個月為界限分為三個情況分別考慮:
第四個月以前,沒有兔子死亡,與原始的斐波那契數(shù)列相同;
第四個月,第一個月的一對兔子生下一對小兔子,其后死亡,從原數(shù)列中減去1;
第四個月后,每個月都在原數(shù)列中減去三個月前出生的兔子。
該方法可推廣為:

代碼
i = 3
n = 6
m = 3
f = [0, 1, 1]
s = 0
while i <= n:
??? if i <= m:
??????? s = f[i-1] + f[i-2]
??? elif i == m+1:
??????? s = f[i-1] + f[i-2] - 1
??? elif i > m+1:
??????? s = f[i-1] + f[i-2] - f[i-m-1]
??? i += 1
??? f.append(s)
print(f[n])