6-4 兔子繁殖
6-4 兔子繁殖
分数 20
作者 陶灵兵
单位 浙江理工大学
兔子繁殖问题。假设有一对新生的兔子,从第三个月开始他们每个月月初都生一对兔子,新生的兔子从第三个月月初开始又每个月又生一对兔子。按此规律,并假定兔子没有死亡,n(n<=20)个月月末共有多少对兔子?
函数接口定义:
函数接口:
rabit(n),n为第几个月
裁判测试程序样例:
n=int(input())
print(rabit(n))
输入样例1:
在这里给出一组输入。例如:
3
输出样例1:
在这里给出相应的输出。例如:
2
输入样例2:
在这里给出一组输入。例如:
5
输出样例2:
在这里给出相应的输出。例如:
5
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
解题思路
本题解题方法较多,本题可以看作为数组问题。首先我们将兔子分为三类,分别是刚出生,一个月以上和满2个月以上的兔子。我们得到一个线性的结构,用数组表示如图

通过数组我们可以清楚的看到每一个月每个分类的兔子数量变化。三个月总数为2只,到了第五个月数量变为5只,其中一个月不到的兔子2只,一个月以上兔子1只,满两个月的兔子为2只。
变化规律很简单,超过2个月的兔子全部放在列表的第三个元素中,1月的兔子会直接变化为二月兔子的数量,所以直接第二个元素直接等于第一个元素的值,第一个元素也就是不满一个月的兔子,它的数量变化是由满三个月兔子数量来决定的,每一个满三个月兔子都会下小兔子,所以直接等于第三个元素。
以上本题有了清晰的思路,代码编写就非常简单。
def rabit(n):
num = [1, 0, 0]
while n - 1:
num[2] += num[1]
num[1] = num[0]
num[0] = num[2]
n -= 1
return sum(num)
本题虽然结束,但是以上代码单单只能适用于兔子第三个月生产的情况,如果是任意一个月生产呢?那岂不是要手动操作很多数组吗?如果数据够大,显然不能搞定。所以优化以上代码,我们编写一个能指定任意生产月份,任意时间的程序,彻底解决兔子问题!
def rabit(n):
birth_month = 3
num = [0, 1]
for i in range(birth_month - 1):
num.append(0)
while n - 1:
num[birth_month] += num[birth_month - 1]
for i in range(birth_month - 1, 0, -1):
if i - 1 <= 0:
break
num[i] = num[i - 1]
num[1] = num[birth_month]
n -= 1
return sum(num)
通过优化程序,我们解决了初始化问题,手动修改数组的问题,使得能够计算出指定某一个月生产某月后兔子的数量。

浙公网安备 33010602011771号