JER的小站

兔子生育问题

2025/11/12
8
0

这是在C语言课堂上遇到的一道题,其实不算简单,很容易绕进去,题目大致如下:

有一对兔子,从出生后第三个月开始每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假设所有兔子都不死,求到第n个月时,兔子总数为多少

我们拿到这个问题,肯定没什么头绪,感觉无从下手,我们其实可以先举例几个月来看一下,由于生育均以对数为单位,我们也先只考虑对数,举前5个月的结果如下图

通过图中的数据,我们可以隐约察觉到兔子的对数是一个斐波那契数列(1,1,2,3,5......),我们应该如何证明呢?我们不妨记第N个月的兔子数量满足F(n),注意到第N个月的兔子数由以下两部分构成:

1.第N-1个月的兔子数,即F(n-1)

2.第N个月新生育的兔子数,由于兔子在第三个月开始生育,所以第N个月新生的兔子其实全部来自于第N-2个月的兔子,即第N个月新生的兔子数等于第N-2个月的兔子数,即F(n-2)

所以有F(n)=F(n-1)+F(n-2),又因为F(1)=F(2)=1,所以兔子的对数满足斐波那契数列,基于以上数学原理,我们只需实现一个计算斐波那契第n项的函数,由于其满足递推式F(n)=F(n-1)+F(n-2),所以毫无疑问,用递归算法是最优的选择(当然,用迭代也可以),具体代码实现如下(C语言实现)

#include <stdio.h>
int fab(int n){
    if (n == 1){
        return 1;
    } else if (n == 2){
        return 1;
    } else {
        return fab(n - 1) + fab(n - 2);
    }
}//斐波那契数列实现

int main(void){
    int n;
    scanf("%d", &n);
    int num = fab(n);
    printf("%d\n", num*2);//因为要求兔子的总数而不是对数,所以要乘以2
    return 0;
}