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

76 阅读3分钟

问题描述🐰

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

  1. 每对成年兔子每个月会生育一对新的小兔子(一雌一雄)。
  2. 新生的小兔子需要一个月成长,到第二个月才能开始繁殖。
  3. 兔子永远不会死亡。

小 R 从一对新生的小兔子开始观察。他想知道在第 A 个月末,总共会有多少对兔子。

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

注意:

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

输入

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

返回

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


用例分析

先从简单的例子开始看看兔子是怎么繁殖的:

第 1 个月

  • 只有 1 对兔子(新生的)。
  • 总数 = 1 对。

第 2 个月

  • 新生的小兔子长大变成成年兔子。
  • 总数 = 1 对。

第 3 个月

  • 成年兔子生出 1 对新兔子。
  • 总数 = 2 对。

第 4 个月

  • 1 对新生兔子长大变成成年兔子。
  • 1对成年兔子生出 1 对新兔子。
  • 总数 = 3 对。

第 5 个月

  • 1 对新生兔子长大变成成年兔子。
  • 2对成年兔子生出 2 对新兔子。
  • 总数 = 5 对。

看出规律了吗?

每个月的兔子总数是前两个月的兔子数量相加的结果。这不就是 斐波那契数列

斐波那契数列的规则是这样的:

  • 第 1 个月:1 对兔子。
  • 第 2 个月:1 对兔子。
  • 从第 3 个月开始:本月兔子的总数 = 前一个月的总数 + 再前一个月的总数

完整代码

def solution(A):
    # 用来存储每个月的兔子数量
    f = [0] * (A + 1)  # 初始化一个数组,大小为 A+1
    f[0] = f[1] = 1  # 第 1、2 个月都只有 1 对兔子

    # 从第 3 个月开始计算
    for i in range(2, A + 1):
        f[i] = f[i - 1] + f[i - 2]

    return f[A]  # 返回第 A 个月的兔子数量

让我们看看结果

测试案例 1:第 1 个月

输入:A = 1
输出:1
解释:第 1 个月只有 1 对兔子。

测试案例 2:第 5 个月

输入:A = 5
输出:8
解释:兔子的总数依次是 1, 1, 2, 3, 5, 8。

测试案例 3:第 15 个月

输入:A = 15
输出:987
解释:第 15 个月末,兔子的总数是 987 对。


为什么用斐波那契数列?

你可能会问:为什么用斐波那契数列就能解决问题?

我们再回顾一下兔子的繁殖过程:

  • 本月的总兔子数 = 上个月的兔子数(已经存在的兔子) + 上上个月的兔子数(这些兔子本月刚繁殖出的小兔子)。

这个规律和斐波那契数列完全一致!