斐波那契数列兔子繁殖编程(斐波那契数列兔子问题递归)
C语言编程题目 兔子繁衍问题?
方法一、用递归。
方法二、把兔子定义成结构,每个兔子自带计时器变量,繁殖就是新建节点,构建结构链表。每次循环遍历所有节点的计时变量大于3的就新建一个节点插入链表。最后统计节点数量。
我用方法1来写:
#include stdio.h
int childbirth(int bMth,int gMth)//bMth:调用时传0,gMth:经过的最大月数
{
? int cnt=0,n=bMth,num=2;
? while(n++gMth+1)
? ? ? if(cnt++2)
? ? ? ? ? num=num+childbirth(n,gMth+1);
? return num;
}
int main()
{
? int i,n;
? printf("请输入经过多少月:"),scanf("%d",n);
? for(i=1;i=n;i++)
? ? ? printf("经过%d个月后:兔子数量为:%d\n",i,childbirth(0,i));
? return 0;
}
如何用Java程序编程,最好讲解一下。题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对
这道题目考察的是运用递归(数列)的思路去解决问题。
假设到第24个月,示例代码如下:
public class woo {
public static void main(String args[]) {
System.out.println(fib(24));
}
private static int fib(int n) {
if (n == 1 || n == 2) {
return 1;
} else {
return fib(n - 1) + fib(n - 2);
}
}
}
扩展资料:
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……。
在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
参考资料:
百度百科:斐波那契数列
百度百科:递归函数
C语言编程:兔子繁殖问题
如图,此题难度较大,要用到队列(我优化为循环队列)(此题有两个提问,都是我回答所以一样)
运行结果,兔子数量变化符合斐波那契数列(下面一行数字为0~6岁每半岁兔子数量)
源代码:(网页端才完整)
#includestdio.h
#define?LIFETIME?13 //兔子寿命,单位半年(年龄小于此!)
#define?INITNUM?1 //初始兔子有多少对
main()
{
int?hY=0; //兔子历(就是时刻表):单位:半年
int?num[LIFETIME]={INITNUM,0}; //存储不同年龄兔子的对数(初始为0岁1对)
//babyI下标代表0岁,往前年龄增大,越过数组下界跳到上界,所以babyI+1反而是最老兔子
int?babyI=0; //0岁兔子对应下标,年龄单位为半年
int?loveNum=0; //可生育兔子数量
int?totalNum=INITNUM; //总计兔子数量
int?age1I=LIFETIME-2; //1岁兔子对应下标(开始能生育)
int?age5_5I=LIFETIME-11; //1岁、5.5岁兔子对应下标(刚好能生育、刚好不能生育年龄)
int?n=30; //输入n半年后!
while(hY?=?n){
int?i,j; //遍历临时变量。①展示兔子数量。
printf("第%.1f年\t总计:%d对\t可生育:%d对\n",(float)hY/2,totalNum,loveNum);
/*
for(i=0;?iLIFETIME;?i++){
printf("%.1f岁\t",(float)i/2?); //打印表头
//printf("%d,%.1f岁\t",i,(float)(++i)/2?); //打印表头
}printf("单位:对\n"); //换行*/
i=babyI; //显示各年龄对应数量
j=0;
do{
//printf("%d\t",num[i]);
if(hY21){ //仅用于加\t显示
if((++j)%2==0)printf("\t");}
printf("%d?",num[i]);
if(i0)i--; //下标循环往左移动
else?i=LIFETIME-1;
}while(i!=babyI);
printf("\n"); //换行
//②半年后
hY++; //时间过去半年
age1I=?(age1I+1)%LIFETIME?; //1岁数量(对)对应下标
age5_5I=?(age5_5I+1)%LIFETIME?;//5.5岁数量(对)对应下标
//printf("%d,%d\n",age1I,age5_5I);
loveNum?+=?num[age1I]?-num[age5_5I]; //可生育兔子数量(对)
babyI?=?(babyI+1)%LIFETIME; //新babyI设为原最老兔子的下标,
totalNum?+=?loveNum?-?num[babyI]; //每对大兔子可以生一对小兔子?-?死亡的老兔
num[babyI]?=?loveNum?; //老兔的位置换成新兔
}
}