兔群繁殖之谜——题目解析及解题

66 阅读2分钟

兔群繁殖之谜——题目解析及解题

问题描述

小R观察到这种特殊兔子品种的繁殖遵循以下规律:

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

他想知道在第A个月末,总共会有多少对兔子。

输入与输出

  • 输入:一个整数A(1 ≤ A ≤ 50),表示月份数。
  • 返回:一个长整数,表示第A个月末兔子的总对数。

测试样例

  • 样例1:输入A = 1,返回1。
  • 样例2:输入A = 5,返回8。
  • 样例3:输入A = 15,返回987。

解题思路

这个问题实际上是一个经典的斐波那契数列问题。斐波那契数列是一个每一项都是前两项和的数列,通常形式为:0, 1, 1, 2, 3, 5, 8, 13, 21, ...。在这个问题中,我们可以看到,每个月的兔子对数也是前两个月兔子对数的和。

代码实现

def solution(A: int) -> int:
    if A == 1:
        return 1
    elif A == 2:
        return 2
    
    # 初始化前两个月的兔子对数
    prev1, prev2 = 1, 2
    
    # 计算从第三个月开始每个月的兔子对数
    for i in range(3, A + 1):
        current = prev1 + prev2
        prev1, prev2 = prev2, current
    
    # 返回第A个月的兔子对数
    return prev2

if __name__ == "__main__":
    # Add your test cases here
    print(solution(1) == 1)
    print(solution(5) == 8)
    print(solution(15) == 987)

代码解析

  1. 边界条件处理:首先,我们处理了A为1和2的边界情况,因为这两个月份的兔子对数是已知的。
  2. 初始化变量:我们使用prev1prev2来存储前两个月的兔子对数,初始值分别为1和2。
  3. 循环计算:从第三个月开始,我们使用一个循环来计算每个月的兔子对数。每个月的兔子对数是前两个月兔子对数的和,我们将其存储在current变量中,然后将prev1prev2更新为上个月和当前月的兔子对数。
  4. 返回结果:最后,我们返回第A个月的兔子对数。