读书人

【java练习1】-费伯纳契数列

发布时间: 2012-09-19 13:43:54 作者: rapoo

【java练习题1】--费伯纳契数列

【程序1】 ??

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? ??

1.程序分析: ? 兔子对的规律为数列1,1,2,3,5,8,13,21.... ?

?

2.

public static int count(int yuefen){

if(yuefen==1||yuefen==2){

return 1;

}else{

return count(yuefen-1)+count(yuefen-2);

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

int yuefen=1;

Scanner s=new Scanner(System.in);

System.out.println("输入月份");

yuefen=s.nextInt();

System.out.println("兔子对的总数是:"+count(yuefen));

}

1 楼 mfkvfn 2012-04-25 代码性能非常不好。

count(6)
=count(5)+count(4)
=[count(4)+count(3)]+[count(3)+count(2)]
={[count(3)+count(2)]+[count(2)+count(1)}+[count(3)+count(2)]
={[count(3)+count(2)]+[count(2)+count(1)}+[count(3)+count(2)]
={[count(2)+count(1)+count(2)]+[count(2)+count(1)}+[count(2)++count(1)+count(2)]

你有没有发现你计算了1次count(6),1次count(5),2次count(4),3次count(3),5次count(2)和3次count(1)?严重的浪费。count(6)=count(5)+count(4)=count(4)+cpunt(3)+count(4)根本不需要算2次count(4),一次就够了。


应该从前面开始算,然后缓存结果。
比如

n F(n-1) F(n)
1 F(0)=0 F(1)=1
2 F(1)=1 F(2)=1
3 F(2)=1 F(3)=2
4 F(3)=2 F(4)=3
5 F(4)=3 F(5)=5
...

每一行F(n-1)等于上一行的F(n)。每一行的F(n)等于上一行2个数之和。
这样算F(6)时只需要各计算一次F(1)、F(2)、...、F(6)。而不是你那样的分别计算3次、5次、3次、2次、1次。

读书人网 >编程

热点推荐