生物学家小 R 正在研究一种特殊的兔子品种的繁殖模式。这种兔子的繁殖遵循以下规律: 每对成年兔子每个月会生育一对新的小兔子(一雌一雄)。 新生的小兔子需要一个月成长,到第二个月才能开始繁殖。 兔子永远不会死亡。 小 R 从一对新生的小兔子开始观察。他想知道在第 A 个月末,总共会有多少对兔子。 请你帮助小 R 编写一个程序,计算在给定的月份 A 时,兔子群体的总对数。 注意: 初始时有 1 对新生小兔子。 第 1 个月末有 1 对兔子:原来那对变成了成年兔子,并开始繁殖。 第 2 个月末有 2 对兔子:原来那 1 对成年兔子,繁殖了 1 对新生的小兔子。 从第 3 个月开始,兔子群体会按照上述规律增长。 输入 一个整数 A(1 ≤ A ≤ 50),表示月份数。 返回 一个长整数,表示第 A 个月末兔子的总对数。
# 初始化前两个月的兔子数量
if A == 1:
return 1
elif A == 2:
return 2
# 使用两个变量表示前两个月的兔子对数
prev1, prev2 = 1, 2
for month in range(3, A + 1):
current = prev1 + prev2
prev1 = prev2
prev2 = current
return prev2
# 测试代码
if __name__ == "__main__":
print(solution(5) == 8)
print(solution(1) == 1)
print(solution(15) == 987)
print(solution(50) == 20365011074)
学习笔记:兔子繁殖问题与斐波那契数列
兔子繁殖问题是一个经典的数学模型问题,其背后隐藏的数学规律与“斐波那契数列”紧密相关。以下是详细的学习分析与总结。
一、问题背景和描述
-
问题背景:
- 兔子的繁殖遵循自然规律:
- 每对成年兔子每月生育一对新生小兔子。
- 新生兔子需要一个月才能成长为成年兔子,随后开始繁殖。
- 兔子不会死亡,数量只会不断增长。
- 从初始的 1 对小兔子开始计算,每个月底统计总的兔子对数。
- 兔子的繁殖遵循自然规律:
-
目标:
- 给定一个月数 ( A ),计算到第 ( A ) 个月末兔子的总对数。
-
限制条件:
- 初始条件:第 1 个月末兔子的数量为 1 对。
- 月份范围:( 1 -12)。
二、数学模型分析
-
兔子群体的变化规律:
- 第 1 个月:只有 1 对小兔子,成长为成年兔子,数量为 1。
- 第 2 个月:成年兔子繁殖出 1 对新生兔子,总数量为 2 对。
- 第 3 个月:原来的成年兔子继续繁殖,且第 2 个月出生的小兔子长成成年兔子,总数量为 3 对。
- 第 4 个月:成年兔子繁殖出 2 对小兔子,总数量为 5 对。
通过观察,兔子数量的增长遵循以下规律:
- 总数 = 上个月的总数 + 前上个月的总数。
- 这就是“斐波那契数列”的增长模式。
-
斐波那契数列的公式:
- 定义递推关系:
- ( F(1) = 1 )
- ( F(2) = 1 )
- ( F(n) = F(n-1) + F(n-2) ) (( n \geq 3 ))
- 解释:
- 当前月份的兔子总对数等于上个月的总数(包括成年兔子和未成年兔子)加上两个月前成年兔子繁殖出的新兔子数量。
- 定义递推关系:
三、解决问题的思路
-
递归实现(数学递推):
- 按照斐波那契数列的定义,递归计算兔子数量。
- 优点: 代码逻辑简单,易于理解。
- 缺点: 重复计算较多,效率较低,尤其是当月份 ( A ) 较大时,递归深度会增加。
-
动态规划:
- 使用数组记录每个月的兔子数量,逐步累加计算。
- 避免重复计算,将递归问题转化为迭代计算。
- 优点: 高效,时间复杂度 ( O(A) ),空间复杂度 ( O(A) )。
- 优化方向: 如果只需要前两个月的值,可进一步优化空间复杂度为 ( O(1) )。
-
数学公式:
- 斐波那契数列有一个通项公式,但因涉及高次方和根号计算,直接实现较为复杂且容易引入误差。
- 实际应用中更推荐使用动态规划法。