兔群繁殖之谜 | 豆包MarsCode AI刷题

66 阅读3分钟

问题描述

生物学家小 R 正在研究一种特殊的兔子品种的繁殖模式。这种兔子的繁殖遵循以下规律:
每对成年兔子每个月会生育一对新的小兔子(一雌一雄)。 新生的小兔子需要一个月成长,到第二个月才能开始繁殖。 兔子永远不会死亡。
小 R 从一对新生的小兔子开始观察。他想知道在第 A 个月末,总共会有多少对兔子。 请你帮助小 R 编写一个程序,计算在给定的月份 A 时,兔子群体的总对数。

注意:
初始时有 1 对新生小兔子。
第 1 个月末有 1 对兔子:原来那对变成了成年兔子,并开始繁殖。
第 2 个月末有 2 对兔子:原来那 1 对成年兔子,繁殖了 1 对新生的小兔子。
从第 3 个月开始,兔子群体会按照上述规律增长。

输入
一个整数 A(1 ≤ A ≤ 50),表示月份数。
返回
一个长整数,表示第 A 个月末兔子的总对数

问题背景

这个问题实际上是著名的斐波那契数列问题,其中每个月的兔子对数是前两个月兔子对数之和。
斐波那契数列的定义是:F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2) (n>2)
在这个问题中,我们从第3个月开始,每个月的兔子对数就是斐波那契数列中的一个数

程序分析

使用迭代方法来计算斐波那契数列的第A项,即第A个月的兔子对数。

函数定义solution(A),参数A,表示月份数。

如果月份数为1,根据题目描述,第1个月末有1对成年兔子,所以直接返回1。

如果月份数为2,根据题目描述,第2个月末有2对兔子(1对成年兔子和1对新生的小兔子),所以返回2。

初始化两个变量prevcurr,分别代表前一个月和当前月的兔子对数。这里prev被初始化为1(第1个月的兔子对数),curr被初始化为2(第2个月的兔子对数)。

从第3个月开始循环到第A个月,在每次循环中,更新prevcurr的值。prev被更新为curr的值(即上个月的兔子对数),curr被更新为prev + curr的值(即当前月的兔子对数,等于前两个月兔子对数之和)。

测试样例

输入:A = 1

返回:1

输入:A = 5

返回:8

输入:A = 15

返回:987

代码实现

def solution(A):
    if A == 1:
        return 1
    elif A == 2:
        return 2
 
    prev, curr = 1, 2  # 初始化第1和第2个月的兔子数
    for _ in range(3, A + 1):
        prev, curr = curr, prev + curr  # 更新前两个月的兔子数
 
    return curr
 
# 测试样例
print(solution(1)==1)  # 输出:1
print(solution(5)==8)  # 输出:8
print(solution(15)==987) # 输出:987
   

时间复杂度

时间复杂度是 O(A),其中 A 是输入的月份数。这是因为程序中有一个循环,它从第3个月开始,一直运行到第 A 个月。对于每个月,我们只做一次赋值操作,所以总的操作数是 A-2(因为前两个月是直接返回的,不需要循环)。因此,时间复杂度是线性的,与输入的大小成正比。

空间复杂度

空间复杂度是 O(1)。这个程序只使用了两个变量prevcurr来存储前两个月的兔子对数,而这两个变量的数量不随输入大小 A 的增加而增加。因此,无论 A 的值是多少,我们使用的额外空间都是常数,所以空间复杂度是常数级别的。