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)

通过优化程序,我们解决了初始化问题,手动修改数组的问题,使得能够计算出指定某一个月生产某月后兔子的数量。

posted @ 2022-12-05 23:15  蠢蛋快跑  阅读(308)  评论(0)    收藏  举报