一对松鼠,从出生后第3个月起每个月都生一对小松鼠 (公母各一只)
小松鼠子长到第3个月后每个月又生一对小松鼠 (公母各一只)
小松鼠的寿命为10个月,假设第一个月有一对刚出生的小松鼠问第n个月有多少对小松鼠?假设小松鼠寿命在第10个月时,仍会生一对小松鼠;
首先,当我们不考虑小松鼠的寿命时,每个月的小松鼠的数量如下:
使用如下表格,表示每个月生产的松鼠数量。
月份 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
大松鼠 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 | 144 |
小松鼠 | 1 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 |
总数 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 | 44 | 233 |
- 第一个月,只有1只小松鼠。
- 第二个月,小松鼠变成大松鼠。
- 第三个月,第二个月的大松鼠可以生产了,生下了一只小松鼠。(这样表示,就使得一对松鼠,在第一个月是小松鼠,第二个月是大松鼠,变成大松鼠的次月(即第三个月),就可以一直生产小松鼠了,满足了条件
从出生后每3个月起都生一对小松鼠
) - 第四个月,小松鼠长成大松鼠,加上原来的大松鼠,大松鼠2对,第三个月的大松鼠生下小松鼠,小松鼠1对
- 第五个月,小松鼠长成大松鼠,加上原来的大松鼠,大松鼠3对,第四个月的大松鼠生下小松鼠,小松鼠2对
这是一个斐波拉契数列,即第n个月的松鼠数量等于上个月(n-1)和上上个月(n-2)的松鼠数量总数。
然后,我们考虑 小松鼠的寿命为10个月
,意味着小松鼠1月份出生,在11月份死亡,我们需要在第n个月减掉第n-10个月时的小松鼠数量,而n-10月时的小松鼠数量为第n-11月时的大松鼠数量,为第n-12月时的松鼠总数。
最终的代码如下:
def fibo(n):
fibo_array = [1, 1]
# a,b 分别存储前两项的值
a = 1
b = 1
for i in range(3,n+1):
c = a + b
if i == 11:
c = c - 1
if i > 12:
c = c - fibo_array[i-12]
a, b = b, c
fibo_array.append(c)
print(c)