[Java] 纯文本查看 复制代码
/*
斐波那契数列:
兔子问题:
有一对兔子,从出生后第3个月起每个月都生一对兔子,
小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,
问每个月的兔子对数为多少?
*/
/*
分析:
常规的思想是用数学上的斐波那契数列通过递归的方法来实现的。下面的程序一(Prog1)
就是利用斐波那契数列的规律递归调用,来解决数量的问题。
但是,这种方法太过于理想化在遇到实际问题时,比如兔子如果会死,这个方法显然无法
应付相应情况。
故而,本人利用了面向对象的方法进行递归套用,同样解决了这一问题,并且可扩展性更强。
但是有一个较大的弊端为创建对象较多运行速度稍慢。但优点也很明显就是能计算兔子死这种
情况下的兔子总数
*/
public class Q1RabbitQuestion{
public static void main(String[] args){
//这里只需要创建一个可以生兔子的兔子即可
DoubleRabbit r = new DoubleRabbit();
//开始生兔子,传入想知道个数的月数,打印总数
System.out.println("第30个月兔子总数为:"+r.born(30));
}
}
/*
定义一个一对兔子的类,兔子对象的功能就是生小兔子和输出给定月数小兔子的总数。
所以它需要有一个count成员变量来存放兔子总数,一个born方法来生小兔子。
*/
class DoubleRabbit{
//用来存放兔子总数(第一个兔子算一个)
private int count = 1;
//生小兔子方法
public int born(int monthNum){
for(int i=1; i<=monthNum; i++){
//三个月后才开始生小兔子,以后每个月生一个
if(i>=3){
//创建一个小兔子对象
DoubleRabbit doubleR = new DoubleRabbit();
//doubleR兔子生兔子,并返回doubleR兔子所生兔子总数(包括它自己)
//这里参数monthNum-i+1之所以要+1是因为,在第三个月后,子兔子已经生了一个月了
count += doubleR.born(monthNum-i+1);
}
}
//周期结束后返回兔子总数。
return count;
}
}
/*
Prog1是纯斐波那契数列的使用方法
*/
/*class Prog1{
public static void main(String[] args){
int n = 30;
System.out.println("第"+n+"个月兔子总数为"+fun(n));
}
private static int fun(int n){
if(n==1 || n==2)
return 1;
else
return fun(n-1)+fun(n-2);
}
}*/