问题描述
生物学家小 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
- 函数定义:
python
- []()
- []()
- []()
def solution(A: int) -> int:
- 定义了一个名为 `solution` 的函数,接受一个整数 `A` 作为参数,并返回一个整数。
-
边界条件:
python
if A == 1:
return 1
elif A == 2:
return 2
- 如果
A为 1,直接返回 1,因为第 1 个月末只有 1 对兔子。 - 如果
A为 2,直接返回 2,因为第 2 个月末有 2 对兔子。
- 如果
-
动态规划初始化:
python
a, b = 1, 2
- 初始化两个变量
a和b,分别表示第 1 个月和第 2 个月的兔子对数。
- 初始化两个变量
-
动态规划迭代:
python
for i in range(3, A + 1):
a, b = b, a + b
- 从第 3 个月开始,使用动态规划的思想,每次迭代更新
a和b的值。 a和b的更新规则是:a变为上个月的b,b变为上个月的a和b的和。
- 从第 3 个月开始,使用动态规划的思想,每次迭代更新
-
返回结果:
python
return b
- 最终返回
b,即第A个月末的兔子总对数。
- 最终返回
-
测试样例:
python
if name == "main":
print(solution(1) ==
1) # 第1个月有 1 对兔子
print(solution(5) ==
8) # 第5个月有 8 对兔子
print(solution(15) ==
987) # 第15个月有 987 对
兔子
- 在
__main__模块中,通过测试样例来验证函数的正确性。
- 在
# 用动态规划来计算第 A 个月末兔子的对数
if A == 1:
return 1
elif A == 2:
return 2
# 初始化前两个值
a, b = 1, 2
for i in range(3, A + 1):
a, b = b, a + b
return b
if __name__ == "__main__":
# 测试样例
print(solution(1) == 1) # 第1个月有 1 对兔子
print(solution(5) == 8) # 第5个月有 8 对兔子
print(solution(15) == 987) # 第15个月有 987 对兔子
总结
- 算法思路: 你的代码使用了动态规划的思想,通过迭代更新前两个月的兔子对数来计算第
A个月末的兔子总对数。 - 时间复杂度: 代码的时间复杂度为
O(A),因为需要进行A-2次迭代。 - 空间复杂度: 代码的空间复杂度为
O(1),因为只使用了常数个额外变量。 - 正确性: 代码逻辑正确,能够正确计算出第
A个月末的兔子总对数。