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

74 阅读4分钟

问题描述

生物学家小 R 正在研究一种特殊的兔子品种的繁殖模式。这种兔子的繁殖遵循以下规律:

每对成年兔子每个月会生育一对新的小兔子(一雌一雄)。 新生的小兔子需要一个月成长,到第二个月才能开始繁殖。 兔子永远不会死亡。 小 R 从一对新生的小兔子开始观察。他想知道在第 A 个月末,总共会有多少对兔子。

请你帮助小 R 编写一个程序,计算在给定的月份 A 时,兔子群体的总对数。

注意:

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

输入

一个整数 A(1 ≤ A ≤ 50),表示月份数

输出

一个长整数,表示第 A 个月末兔子的总对数。

测试用例

样例1:

输入:A = 1 返回:1

样例2:

输入:A = 5 返回:8

样例3:

输入:A = 15 返回:987

解题思路

理解问题:每个月的兔子对数是前两个月的兔子对数之和。 数据结构:我们可以使用一个列表来存储每个月的兔子对数。 算法步骤: 初始化前两个月的兔子对数。 从第三个月开始,每个月的兔子对数是前两个月的兔子对数之和。 返回第 A 个月的兔子对数。

代码提示(以PYthon形式)

def solution(A: int) -> int:
    # 初始化前两个月的兔子对数
    if A == 1:
        return 1
    elif A == 2:
        return 2

    # 初始化前两个月的兔子对数
    first, second = 1, 2

    # 从第三个月开始计算
    for _ in range(3, A + 1):
        # 计算当前月的兔子对数
        current = first + second
        # 更新前两个月的兔子对数
        first, second = second, current

    return second

if __name__ == "__main__":
    # 测试用例
    print(solution(1) == 1)
    print(solution(5) == 8)
    print(solution(15) == 987)

关键步骤解释

初始化前两个月的兔子对数: 如果 A 是 1,直接返回 1。 如果 A 是 2,直接返回 2。 从第三个月开始计算: 使用一个循环从第三个月开始,计算每个月的兔子对数。 当前月的兔子对数是前两个月的兔子对数之和。 更新前两个月的兔子对数,以便下一次循环使用。

可能遇到的问题: 如何使用动态规划来解决这个问题?

使用动态规划来解决这个问题是一个很好的选择,因为它可以有效地避免递归带来的重复计算问题。我们可以通过维护一个数组来存储每个月的兔子对数,从而逐步计算出第 A 个月的兔子对数。

解题思路

def solution(A: int) -> int:
    # 初始化数组,存储每个月的兔子对数
    dp = [0] * (A + 1)

    # 初始化前两个月的兔子对数
    dp[1] = 1
    dp[2] = 2

    # 从第三个月开始计算
    for i in range(3, A + 1):
        # 当前月的兔子对数是前两个月的兔子对数之和
        dp[i] = dp[i - 1] + dp[i - 2]

    # 返回第 A 个月的兔子对数
    return dp[A]

if __name__ == "__main__":
    # 测试用例
    print(solution(1) == 1)
    print(solution(5) == 8)
    print(solution(15) == 987)

关键步骤解释

初始化数组: 创建一个长度为 A + 1 的数组 dp,用于存储每个月的兔子对数。 初始化 dp[1] 为 1,表示第 1 个月的兔子对数。 初始化 dp[2] 为 2,表示第 2 个月的兔子对数。 从第三个月开始计算:

使用一个循环从第 3 个月开始,计算每个月的兔子对数。 当前月的兔子对数是前两个月的兔子对数之和,即 dp[i] = dp[i - 1] + dp[i - 2]。

返回第 A 个月的兔子对数: 返回 dp[A],即第 A 个月的兔子对数。

总结

此题使用动态规划解决问题更合适,题目难度适中。