兔子会死怎么办? 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,假如兔子会死

Posted amcomputer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了兔子会死怎么办? 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,假如兔子会死相关的知识,希望对你有一定的参考价值。

兔子会死 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,假如兔死

1 兔子不会死

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月兔子有多少对,第20个月有多少对?

2.1 斐波那契思想

程序分析: 第一个月、第二个月小兔子没有繁殖能力,所以还是1对 两个月后,生下一对小兔民数共有2对 三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是3对,依次类推可以列出下表兔子的规律为数列1,1,2,3,5,8,13,21…这个数列有关十分明显的特点,那是:前面相邻两项之和,构成了后一项。 这个数列是意大利中世纪数学家斐波那契在<算盘全书>中提出的。

2.2 动态规划思想

由于第i项为第第i-1项加上第i-2项,即该数列满足:f[i] = f[i-1] + f[i-2] ,这里的条件是i大于2。求解第n个月的兔子总数问题,变为了求解第n-1个月的兔子总数 , 和第n-2个月的兔子总数,直到求解n, n-1,…, 2,1的问题,故可以使用DP来做该题, 实现比较简单:

定义状态:用f[i]表示了第i个月的兔子总数为f[i]
状态转移方程:f[i] = f[i-1] + f[i-2]
初始值和边界值: f[0] = f[1] = 1
计算方向:从左到右

编程实现:

def rabbitBirthNoDeath(n=20):
    f = [0 for i in range(n)]
    f[0] = f[1] = 1
    for i in range(2,n):
        f[i] = f[i-1] + f[i-2]
    print(f)

2 兔子会死

但是如果兔子会死怎么办? 因为我们大家都知道,兔子不可能无限繁殖,很多笔者都写了关于兔子不会死的情况,而对于兔子会死的场景,很少有人去考虑,笔者记得,在练习的时候就遇到过这个情况,即兔子会死的情况。今天就来彻彻底底的分析分析:

题目变种:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子寿命为半年,问每个月兔子有多少对,第20个月有多少对?

题目分析:假如兔子寿命为半年,说明了一只兔子的寿命为6个月,但问题来了,兔子在第6个月是先死还是先死了,为了不纠结这个问题,笔者直接定义为兔子先生, 生完兔子后在死,然后再计算总数。

兔子到第7个月时,才会有兔子真正死去。
在第7个月的兔子总数 = 在第6个月的兔子总数 + 在第5个月的兔子总数 - 在第1个月的兔子总数
形式化为: f[7] = f[6] + f[5] - f[1]

故当i<=6时,f[i] = f[i-1] + f[i-2]

故当i>6时, f[i] = f[i-1] + f[i-2] - 死去的兔子数量

所以该题的关键是如何计算死去的兔子数量

可以看到周期为6后,就会有兔子死去,故需要得到周期值
在通过取模运算得到具体的位置。就可以得到死去的兔子数量

代码实现:

def rabbitBirthDeath(n=20):
    f = [0 for i in range(n)]
    f[0] = f[1] = 1
    for i in range(2,n):
        # 如果兔子的寿命为6个月
        if (i <=6 ):
            f[i] = f[i-1] + f[i-2]
        else:
            k = i%6-1 #获取具体位置 在第k个位置
            period = int(i/6) -1  #在第period个周期
            f[i] = f[i-1] + f[i-2] - f[period*6+k]
    print(f)

3 结果对比

不会死:[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
会死: [1, 1, 2, 3, 5, 8, 12, 19, 29, 45, 69, 106, 163, 250, 384, 589, 904, 1387, 2128, 3265]

以上是关于兔子会死怎么办? 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,假如兔子会死的主要内容,如果未能解决你的问题,请参考以下文章

古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四 个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少?

JAVA习题一古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少?

题目序号(1~5)

算法设计兔子问题

4.古典问题:有一对兔子(斐波那契数列)