斐波拉契数列 - 松鼠变体

132 阅读2分钟
一对松鼠,从出生后第3个月起每个月都生一对小松鼠 (公母各一只)
小松鼠子长到第3个月后每个月又生一对小松鼠 (公母各一只)
小松鼠的寿命为10个月,假设第一个月有一对刚出生的小松鼠问第n个月有多少对小松鼠?假设小松鼠寿命在第10个月时,仍会生一对小松鼠;

首先,当我们不考虑小松鼠的寿命时,每个月的小松鼠的数量如下:

使用如下表格,表示每个月生产的松鼠数量。

月份12345678910111213
大松鼠01123581321345589144
小松鼠101123581321345589
总数112358132134558944233
  1. 第一个月,只有1只小松鼠。
  2. 第二个月,小松鼠变成大松鼠。
  3. 第三个月,第二个月的大松鼠可以生产了,生下了一只小松鼠。(这样表示,就使得一对松鼠,在第一个月是小松鼠,第二个月是大松鼠,变成大松鼠的次月(即第三个月),就可以一直生产小松鼠了,满足了条件从出生后每3个月起都生一对小松鼠
  4. 第四个月,小松鼠长成大松鼠,加上原来的大松鼠,大松鼠2对,第三个月的大松鼠生下小松鼠,小松鼠1对
  5. 第五个月,小松鼠长成大松鼠,加上原来的大松鼠,大松鼠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)