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的矩阵,并且定义好矩阵的乘法以及乘方运算,就可以计算了。