C语言兔子生兔子的问题(3中解法)
有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
兔子的规律为数列:1, 1, 2, 3, 5, 8, 13, 21 ....
下面使用了迭代、递归和数组三种解法。
【代码一】使用迭代:
【代码三】使用数组:
兔子的规律为数列: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; }运行结果:
运行结果: 输入要计算的月数:10 第1个月有1只 第2个月有1只 第3个月有2只 第4个月有3只 第5个月有5只 第6个月有8只 第7个月有13只 第8个月有21只 第9个月有34只 第10个月有55只【方法二】使用递归:
#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; }运行结果:
输入要计算的月数:10 10个月的兔子总数为55递归看上去非常符合逻辑,但是这种递归效率是非常慢的,不信你计算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]); }运行结果:
请输入月数:10 第10个月的兔子为:55