生兔子的经典编程算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生兔子的经典编程算法相关的知识,希望对你有一定的参考价值。

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月
   后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....

这个规律对么?不懂啊

一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔都不死,那么一年以后可以繁殖多少对兔子?
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种算法是基于第一种算法的原理的。只不过实在太复杂了,我自己脑子里只能粗略整理它的逻辑关系(其实也不是很懂),所以写出来大家一定看不懂。。。

后记:这个经典的兔子数列其实还可以继续玩下去。有非常复杂的递推关系(自己说的,虽然没学过什么叫真正的递推不过应该差不多吧)。每个参数影响非常复杂。我本来想继续这个混乱的递推逻辑,但想到再复杂的算法的时候我差不多都要疯掉了。。啊啊啊,暂时就这样吧~~~大脑休息下。熄火。
参考技术A 恩,你列的是对的。
#include<stdio.h>
void main()

int i,a[20]=1,1;
for(i=2;i<20;i++)
a[i]=a[i-1]+a[i-2];
for(i=0;i<20;i++)
printf("%d ",a[i]);
printf("\n");
参考技术B 显然这个兔子的数量是斐波那契数列,用斐波那契数列通项公式Fn=((1+5^0.5)^n/2^n - (1-5^0.5)^n/2^n)/5^0.5即可 参考技术C var b = 2,
c = 0;
for(var a = 1; a < 8; a++) 
if(a % 2 == 0) 
c += b
alert(c)
 else 
b += c
alert(b)

以上是关于生兔子的经典编程算法的主要内容,如果未能解决你的问题,请参考以下文章

C语言经典编程题(上)

c-大量经典的c算法---ShinePans

Java算法编程50题

Java算法编程50题

需掌握 - JAVA算法编程题50题及答案

Java经典问题算法大全