每天一个算法之fibonacci递归法优化

public class fibonacci {
         publicstatic void main(String args[]){
                   longt1=System.nanoTime();
                   longn1=recursion(40);
                   longt2=System.nanoTime();
                   longn2=circulation(40);
                   longt3=System.nanoTime();
                   System.out.println("result:"+n1+"----time:"+(t2-t1));
                   System.out.println("result:"+n2+"----time:"+(t3-t2));
         }
         //recursionis very clear.but,this method has high complexity,100 we can not caculate theresult.
         publicstatic long recursion(long n){
                   if(n<=0)return0;
                   if(n==1)return1;
                   returnrecursion(n-1)+recursion(n-2);    
         }
         publicstatic long circulation(long n){
                   if(n<2)returnn;
                   longn0=0;long n1=1;
                   longsum=0;
                   for(longi=2;i<=n;i++){
                            sum=n0+n1;
                            n0=n1;
                            n1=sum;
                   }
                   returnsum;
         }
}

n=10

result:55----time:6736

result:55----time:1283

n=20

result:6765----time:281608

result:6765----time:1604

n=30

result:832040----time:8039639

result:832040----time:8660

n=40

result:102334155----time:967186178

result:102334155----time:12509

n=50

第一个就算不出来了

 

第一个函数的执行对第二个函数的执行会有不小的影响。注释掉第一个函数的,第二个函数运行时间会更短,不过这个结果足够说明递归在有些时候是不适合的。

                  f(10)
               /        \
            f(9)         f(8)
          /     \       /    \
       f(8)     f(7)  f(7)   f(6)
      /   \     /   \ 
   f(7)  f(6)  f(6) f(5)

第一个函数之所以慢是因为里面有重复计算的值,第二个函数正是克服了这种缺点。

这还不是最快的方法。下面介绍一种时间复杂度是O(logn)的方法。在介绍这种方法之前,先介绍一个数学公式:


通过数学归纳法可以证明


实现这种方式时,首先需要定义一个2×2的矩阵,并且定义好矩阵的乘法以及乘方运算,就可以计算了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值