python兔子繁殖问题

时间:2025-01-29 13:55:14

设有一对新生的兔子从第3个月开始他们每个月月初都生一对新兔子,
新生的兔子从第3个月开始又每个月月初生一对兔子,
求n个月后兔子的总对数
这个和求第n个斐波那契数有着异曲同工之妙
为什么n要-1

我们假设初始的这一对兔子是0个月
过1个月长1个月,长了2个月后,第3个月月初,它才2个月吧,就可以生兔子了
新生的一对兔子是月初出生的,所以过完那个月就一个月大了,再过1个月就可以生兔子了
所以初始化的时候是没有一个月的兔子的,需要过一个月才有,所以我们就减少一次循环

def rabit(n):
    if n==1 or n==2:
        return 1
    a=1
    b=1
    c=2
    for i in range(n-2):
        a=b
        b=c
        c=a+b
    return b

这个月的兔子只有两个来源,一个来源是上个月的老兔子(个数是f(n-1)),另一个来源是这个月刚出生的兔子,而这个月刚出生的兔子,就是两个月前的所有兔子(两个月前的兔子个数是f(n-2)),因为两个月前的所有兔子,无论两个月前就是老的,还是两个月前刚生的,到了这个月就全部具有生育能力,每只都可以下一对儿,所以可以得到一个递推关系f(n) = f(n - 1) + f(n - 2)。