斐波那契数列兔子故事编程(斐波那契兔子数列小视频)

http://www.itjxue.com  2023-03-06 05:29  来源:未知  点击次数: 

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年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

参考资料:

百度百科:斐波那契数列

百度百科:递归函数

(责任编辑:IT教学网)

更多