码迷,mamicode.com
首页 > 其他好文 > 详细

斐波拉契数列带来的思考

时间:2015-05-17 02:14:25      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:斐波那契数列   java   复杂度   

无意间看到一道题:

编写一个计算前100位斐波那契数的函数。根据定义,斐波那契序列的前两位数字是0和1,随后的每个数字是前两个数字的和。例如,前10位斐波那契数为:0,1,1,2,3,5,8,13,21,34。

我一看这不是熟悉的斐波那契数列嘛,简单!一个递归搞定,就没重视了。然后晚上自己尝试写着玩,却发现原来自己智力被爆。

首先写了个这样的程序:

public class FibonnacciA{
	public static void main(String[] args){
		System.out.println(FibonnacciA.count(100));
	}
	public static int count(int t){
		if(t==0){
			return 0;
		}else if(t==1){
			return 1;
		}else if(t>1){
			return count(t-1)+count(t-2);
		}else{
			return 0;
		}
	}
}

尝试跑了下数列的前几位,没问题,然后跑100,诶?怎么跑不出结果?原来还是复杂度的锅。斐波那契数列的递归算法复杂度是O(n!),多么可怕。

然后将程序更改修正后,如下:

public class FibonnacciB{
	public static void main(String[] args){
		System.out.println(FibonnacciB.count(100L));
	}
	public static long count(long t){
		if(t==0L){
			return 0L;
		}else if(t==1L){
			return 1l;
		}else if(t<0L){
			System.out.println("请输入正整数!");
			return 0L;
		}
		long temp1 = 0L;
		long temp2 = 1L;
		long temp = 0L;
		for(long i=0L; i<t; i++){
			temp = temp2;
			temp2 = temp1 + temp2;
			temp1 = temp;
		}
		return temp2;
	}
}

注意到int已经装不下结果了,这里用了long。循环是线性复杂度O(n),结果秒出,真是舒服。

要好好的重视运算复杂度啊亲!

斐波拉契数列带来的思考

标签:斐波那契数列   java   复杂度   

原文地址:http://8471368.blog.51cto.com/8461368/1651972

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!