/**
* 斐波那契数列求值
* 斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)
*/
public class Fibonacci {
public static long fib(long x){
if(x<=2)
return 1;
else{
return fib(x-1)+fib(x-2);
}
}
public static long fib2(long x){
long end = 0;
if(x<=2)
return 1;
else{
long begin1 = 1;
long begin2 = 1;
long temp = 0;
for (int i = 0; i < x-2; i++) {
end = begin1+ begin2;
begin1 = begin2;
begin2 = end;
}
}
return end;
}
public static void main(String[] args) {
long l = new Date().getTime();
System.out.println(Fibonacci.fib(45));
long l2 = new Date().getTime();
System.out.println("递归用时:"+(l2-l));
long l3 = new Date().getTime();
System.out.println(Fibonacci.fib2(45));
long l4 = new Date().getTime();
System.out.println("for循环用时:"+(l3-l4));
}
}
结果:
1134903170
递归用时:2812
1134903170
for循环用时:0
由以上结果可以发现,当前情况下使用递归是不明智的,违反了合成效益法则(相同的计算执行了多次)。
稍微拿笔算一算递归方法求fib(45),运算的次数高达2的次方的次方的次方….左右(45个….的次方)
所以,当明显可以使用for循环求解时,尽量不要使用递归。