这是在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;
}