斐波那契数列兔子故事编程(斐波那契兔子数列小视频)
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?; //老兔的位置换成新兔
}
}
生兔子的经典编程算法
一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔都不死,那么一年以后可以繁殖多少对兔子?
1 1月
1 2月
2 3月
3 4月
5 5月
8 6月
13 7月
21 8月
34 9月
55 10月
89 11月
144 12月
233 13月
第1种:
Private Sub Command1_Click()
i = 0
x = 1
y = 1
b = x "," y
For n = 3 To 13 Step 1
i = x + y
x = y
y = i
b = b "," i
Next
Print b
End Sub
这个算法是最经典的。其实a月的数量也就是老兔子加上新生兔子。老兔子这么算的:因为当月的生产数量为上个月的兔子总数,而这个生产数量就是由老兔子生的。所以老兔子的数量就是a-1月的数量也就是上一个月的数量。新兔子这么算的:因为新兔子就是上一个月的繁殖数量,即a-1月的繁殖数量,而这个繁殖数量就是由a-2月的总数决定的,所以新兔子就是a-2月了。所以根据这个原理,第一种方法成立。
第2种:
Private Sub Command1_Click()
i = 0
x = 1
y = 1
z = 2
b = x "," y "," z
For n = 4 To 13 Step 1
i = y * 2 + x
x = y
y = z
z = i
b = b "," i
Next
Print b
End Sub
第2种算法的逻辑是:
(a月-2的月总数)* 2 + (a月-3月总数)
因为当月的生产数量为上个月的兔子总数,而当月的新兔子(即上个月新生的兔子,这个月还未能生产)数量为上上个月的总数。
第3种:
Private Sub Command1_Click()
i = 0
x = 1
y = 1
z = 2
b = x "," y "," z
For n = 4 To 13 Step 1
i = z * 2 - x
x = y
y = z
z = i
b = b "," i
Next
Print b
End Sub
(a月总数*2) - (a-2月总数)
这第2种算法和第3种算法是基于第一种算法的原理的。只不过实在太复杂了,我自己脑子里只能粗略整理它的逻辑关系(其实也不是很懂),所以写出来大家一定看不懂。。。
后记:这个经典的兔子数列其实还可以继续玩下去。有非常复杂的递推关系(自己说的,虽然没学过什么叫真正的递推不过应该差不多吧)。每个参数影响非常复杂。我本来想继续这个混乱的递推逻辑,但想到再复杂的算法的时候我差不多都要疯掉了。。啊啊啊,暂时就这样吧~~~大脑休息下。熄火。
Java代码编程 经典的兔子问题?
这是斐波那契数列的问题
可以用递归,也可以用循环
递归:
public class Demo3 {
// 使用递归方法
private static int getFibo(int i) {
if (i == 1 || i == 2)
return 1;
else
return getFibo(i - 1) + getFibo(i - 2);
}
public static void main(String[] args) {
System.out.println("斐波那契数列的前20项为:");
for (int j = 1; j = 20; j++) {
System.out.print(getFibo(j) + "\t");
if (j % 5 == 0)
System.out.println();
}
}
}
循环:
public class Demo2 {
// 定义数组方法
public static void main(String[] args) {
int arr[] = new int[20];
arr[0] = arr[1] = 1;
for (int i = 2; i arr.length; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
System.out.println("斐波那契数列的前20项如下所示:");
for (int i = 0; i arr.length; i++) {
if (i % 5 == 0)
System.out.println();
System.out.print(arr[i] + "\t");
}
}
}
如何用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年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
参考资料:
百度百科:斐波那契数列
百度百科:递归函数