问题描述🐰
生物学家小 R 正在研究一种特殊的兔子品种的繁殖模式。这种兔子的繁殖遵循以下规律:
- 每对成年兔子每个月会生育一对新的小兔子(一雌一雄)。
- 新生的小兔子需要一个月成长,到第二个月才能开始繁殖。
- 兔子永远不会死亡。
小 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 对。
为什么用斐波那契数列?
你可能会问:为什么用斐波那契数列就能解决问题?
我们再回顾一下兔子的繁殖过程:
- 本月的总兔子数 = 上个月的兔子数(已经存在的兔子) + 上上个月的兔子数(这些兔子本月刚繁殖出的小兔子)。
这个规律和斐波那契数列完全一致!