利用数组快速实现斐波那契数

 

     斐波那契数一般都是采用递归来予以实现的,但是这存在一个严重的问题——即使在相对较快的计算机上,计算F40需要大约一分钟的时间,就运行时间而言,这是很荒谬的,因为基本运算只需要39次加法。

     根本问题是:递归历程执行了冗余计算,为了计算fib(n) ,我们递归的计算fib(n-1)。当递归使用另一个递归调用,我们计算fib(n-2)。不过,在计算fib(n-1)的过程中,我们早已计算了 fib(n-2),所以调用 fib(n-2) 是一种浪费,是冗余计算。对于N=40,F40=102334155,但是递归调用的总次数超过了300 000 000次!!!

    这里我采用数组实现斐波那契,速度相当的快,代码如下:相互运算时间的比较代码我就不具体贴出来了,很简单。有兴趣的可以用递归的方法与我的方法进行比较,结果一目了然。

 

/**
 * 使用数组利用循环快速实现斐波那契数
 * @author jw
 *
 */
public class Ftest {
   public static long fib(int n){
	  if(n<2){
		  System.out.println("必须输入大于2的数字");
		  return 0;
	  }		  
	 else{
		 int[] a=new int[n+1];	
		 a[0]=0;
		 a[1]=1;
		 for(int i=2;i<=n;i++){
			 a[i]=a[i-1]+a[i-2];
		 }
		 return a[n];
	 }	 
   }
   public static void main(String[] args){
	  System.out.println(fib(40)) ;
	  System.out.println(fib(1)) ;
	  System.out.println(fib(2)) ;
	  System.out.println(fib(10)) ;
	  System.out.println(fib(1000)) ;
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值