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

99 阅读3分钟

这个问题实际上是经典的斐波那契数列问题。兔子的繁殖模式遵循的规律与斐波那契数列一致:

  • 第 (n) 个月兔子的总数等于前两个月兔子总数的和。
  • 初始条件是:
    • 第 1 个月只有 1 对兔子。
    • 第 2 个月有 2 对兔子。

我们可以用递归、动态规划或简单迭代的方法来求解第 (A) 个月的兔子总对数。

实现代码

以下是基于迭代方法的解决方案:

def solution(A: int) -> int:
    if A == 1:
        return 1
    if A == 2:
        return 2

    # 用两个变量存储前两个数
    prev1, prev2 = 1, 2

    # 迭代计算第 A 个月的兔子对数
    for _ in range(3, A + 1):
        current = prev1 + prev2
        prev1 = prev2
        prev2 = current

    return prev2


if __name__ == "__main__":
    # 测试用例
    print(solution(1) == 1)   # 第 1 个月有 1 对兔子
    print(solution(5) == 8)   # 第 5 个月有 8 对兔子
    print(solution(15) == 987)  # 第 15 个月有 987 对兔子

解释

  1. 初始情况

    • 当 (A = 1),返回 1。
    • 当 (A = 2),返回 2。
  2. 迭代计算

    • 从第 3 个月开始,每个月的兔子对数为前两个月兔子对数的和。
    • 使用 prev1prev2 保存前两个月的兔子对数,逐步更新到目标月份。
  3. 时间复杂度

    • 时间复杂度为 (O(A)),只需一次线性遍历。
    • 空间复杂度为 (O(1)),仅使用了常量级变量存储前两个月的兔子对数。

测试结果

运行上面的代码,所有测试用例均应通过。

优化

对于更大的 (A),如果想进一步优化,可以考虑矩阵快速幂法计算斐波那契数列,以将时间复杂度降为 (O(\log A))。不过,迭代法对一般输入已经足够高效。

启示

兔群繁殖问题启示我们,自然现象往往隐藏着简单而优美的数学规律,通过抽象建模可以揭示其本质,并利用算法优化使复杂问题高效求解。它展示了递推关系在描述动态系统中的核心作用,也说明了数学工具(如矩阵快速幂)与算法结合的威力,同时提醒我们在解决问题时,既要关注简化模型的基本规律,又要具备引入复杂约束条件的能力,从而不断创新与拓展问题的解决方法。 如果做不出来,可以通过补充基础知识,强化动态规划、递归和数学建模的理解,多练习类似经典题目以熟悉递推关系的建立和算法优化的思路,同时学会将复杂问题拆解为更小的部分逐步解决。结合手动模拟推导验证自己的想法,必要时参考题解深入理解优秀实现的核心逻辑,不断练习常用算法模板,培养数学推导能力和算法思维,从而逐步提高解决问题的能力和效率。