题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
程序分析:
第一个月-----------------1
第二个月-----------------1
第三个月-----------------2
第四个月-----------------3
第五个月-----------------5
第六个月-----------------8
第七个月-----------------13
... ...
从中发现,从第三个月开始,前两个月兔子数之后为第三个兔子总数,所以定义一个存放24个月兔子书数组,每个元素存放一个月的兔子总数
#include <stdio.h>
int main()
{
int m[23];
int i;
m[0]=m[1]=1;
for (i=0; i<24; i++) {
if (i==0 || i==1) {
printf("第%d个月月兔子数量为:1对\n",i+1);
}
else {
m[i]=m[i-1]+m[i-2];
printf("第%d个月月兔子数量为:%d对\n",i+1,m[i]);
}
}
return 0;
}
运行结果截图(编译环境 mac xcode):
不用数组储存:
#include <stdio.h>
int main()
{
long f1,f2;
int i;
f1=f2=1;
for(i=1;i<=12;i++) //24个月就好了,多了也没意思了
{ printf("%12ld %12ld",f1,f2); //这样每个月的数字就不会在一起了,中间会有空格,因为是长整形所以ld 12ld就是说走总共占12位
if(i%2==0) printf("\n");
f1=f1+f2; //这个月等于前两个月之和
f2=f1+f2; //这个月等于前两个月之和
}
return 0;
}
运行结果截图(编译环境 linux gcc):
再用迭代方法,查询某个月兔子数量
#include <stdio.h>
int fun(int n)
{
if (n==1 || n==2)
return 1;
else
return fun(n-1)+fun(n-2);
}
int main()
{
int mouth;
printf("你需要查询第几个月兔子数");
scanf("%d",&mouth);
fun(mouth);
printf("第%d个月兔子数量为:%d对\n",mouth,fun(mouth));
return 0;
}
运行结果截图(编译环境 linux gcc):
本题迭代方法理解:
假如输入 5,调用fun(),
然后 return fun(5-1)+fun(5-2)
通过函数迭代,fun(4)=fun(3)+fun(2)
fun(3)=fun(2)+fun(1)
fun(2)=1;
fun(1)=1;
在推出 fun(3)=2;
fun(4)=3;
fun(5)=5;