有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
兔子的规律为数列:1, 1, 2, 3, 5, 8, 13, 21 ....
下面使用了迭代、递归和数组三种解法。
【代码一】使用迭代:
- #include <stdio.h>
- int main()
- {
- long f1=1, f2=1; // 兔子的数量
- int i; // 循环次数
- int n; // 要计算的月份
-
- printf("输入要计算的月数:");
- scanf("%d", &n);
-
- // 计算出循环次数
- if(n%2==1){
- n = (n+1)/2;
- }else{
- n = n/2;
- }
- for(i=1;i<=n;i++){
- printf("第%d个月有%d只\n", i*2-1, f1);
- printf("第%d个月有%d只\n", i*2, f2);
-
- f1=f1+f2; /*前两个月加起来赋值给第三个月*/
- f2=f1+f2; /*前两个月加起来赋值给第三个月*/
- }
- return 0;
- }
运行结果:
【方法二】使用递归:
- #include<stdio.h>
- int Feibonacci(int n){
- if(n==1||n==2)
- return 1;
- else
- return Feibonacci(n-1)+Feibonacci(n-2);
- }
- int main(){
- int n; // 要计算的月份
- printf("输入要计算的月数:");
- scanf("%d", &n);
- printf("%d个月的兔子总数为%d\n", n, Feibonacci(n));
-
- return 0;
- }
运行结果:
递归看上去非常符合逻辑,但是这种递归效率是非常慢的,不信你计算20, 30, 40 个月的兔子数试试,明显比另外两种方法慢多了,具体分析请看:C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈
【代码三】使用数组:
- #include<stdio.h>
- void main()
- {
- int a[100] ,i,n;
-
- printf("请输入月数:");
- scanf("%d",&n);
-
- a[0]=a[1]=1;
- for(i=2;i<n;i++)
- a[i]=a[i-1]+a[i-2];
- printf("第%d个月的兔子为:%d\n", n, a[n-1]);
- }
运行结果: