兔子会死怎么办? 古典问题:有一对兔子,从出生后第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个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少?