《兔群繁殖之谜》题目详解 | 豆包MarsCode AI刷题

130 阅读3分钟

以下是对这道关于计算特殊兔子繁殖数量问题的详细解析:

一、解题思路

本题描述的兔子繁殖模式实际上是一个经典的斐波那契数列问题。

  • 初始状态:一开始有 1 对新生小兔子,第 1 个月末这对小兔子变成成年兔但还未繁殖,所以第 1 个月末还是 1 对兔子。

  • 第 2 个月:原来的那对成年兔子繁殖出 1 对新生小兔子,此时共有 2 对兔子(1 对成年兔和 1 对新生兔)。

  • 从第 3 个月起:每个月的兔子总数是前两个月兔子总数之和。因为上个月的成年兔子在本月会继续繁殖新的小兔子,而新出生的小兔子数量恰好等于两个月前兔子的总数(因为两个月前的兔子到这个月都成长为能繁殖的成年兔了)。

所以,我们可以根据这个规律,通过迭代的方式来计算出第 A 个月末兔子的总对数。

二、图解

假设用 F (n) 表示第 n 个月末兔子的总对数,以下是前几个月的情况示意:

月份(n)新生兔子对数成年兔子对数兔子总对数 F (n)
1011
2112
3123
4235
5358

可以看出,从第 3 个月开始,兔子总对数 F (n) = F (n - 1) + F (n - 2),这就是斐波那契数列的递推公式。

三、代码详解

以下是对给定代码的详细解释:

python

def solution(A):
    if A == 1:
        return 1
    elif A == 2:
        return 2
  • 首先,这部分代码处理了前两个月的特殊情况。当输入的月份 A 为 1 时,根据题目描述,一开始只有 1 对新生小兔子,第 1 个月末还是 1 对兔子,所以直接返回 1。当 A 为 2 时,经过第 1 个月那对兔子成长为成年兔并在第 2 个月繁殖出 1 对新生兔,此时共有 2 对兔子,所以返回 2。

python

a, b = 1, 2
for i in range(3, A + 1):
    c = a + b
    a = b
    b = c
  • 这里定义了两个变量 a 和 b,分别初始化为 1 和 2,这对应着第 1 个月末和第 2 个月末兔子的总对数(前面已经处理了这两个月的特殊情况)。

  • 然后通过一个循环,从第 3 个月开始计算后续每个月兔子的总对数。在每次循环中:

    • c = a + b:根据斐波那契数列的递推公式,计算出当前月份兔子的总对数,即当前月份的兔子总对数等于前两个月兔子总对数之和。

    • a = b:将 b 的值赋给 a,这是为了更新 a 的值,使其代表前一个月兔子的总对数,为下一次循环做准备。

    • b = c:将刚计算出的当前月份兔子总对数 c 赋给 b,这样 b 就始终代表当前最新的兔子总对数。

python

return b
  • 循环结束后,b 就存储了第 A 个月末兔子的总对数,所以最后返回 b

python

if __name__ == "__main__":
    print(solution(5) == 8)
    print(solution(1) == 1)
    print(solution(15) == 987)
    print(solution(50) == 20365011074)
  • 在 __main__ 部分,通过调用 solution 函数并将返回值与预期结果进行比较,来验证函数对于不同输入值(这里分别测试了月份为 5、1、15、50 的情况)的计算是否正确。如果函数计算结果与预期结果相等,就会打印出 True,否则打印出 False

综上所述,整个程序通过处理特殊情况和利用斐波那契数列的递推公式,准确地计算出了在给定月份末兔子的总对数。