什么是斐波那契数列?斐波那契数列就是:1,1,2,3,5,8,13,21,34…这样的数列。通过分析可以发现斐波那契数列的规律,当n = 1时,f(n) = 1;当n = 2时,f(n) = 1;当n > 2时,f(n) = f(n-1) + f(n-2);有了这个规律我们就很容易的写代码,但是通常大多数人会直接使用递归的方法来实现斐波那契数列,这种方法很容易想到,但是有优点就会有缺点,我们分析如下:
斐波那契数列问题,有两种的解决办法:
第一种:利用递归的算法,虽然简单,代码数量少,但是随着数的增大,效率降低,还可能出现内存栈的溢出;
第二种:利用循环的方法,虽然比较复杂,代码数量相对教多,但是效率好,花费的时间短,如下面的耗时计算可以看出。
我们分别采用递归和循环的方法来实现斐波那契数列,通过以下的代码可以清楚的看出两者的优缺点,代码如下:
import java.util.Scanner;
class Solution1{
/*本类是通过递归调用的方法求解斐波那契数列*/
public long Function1(int n){
if(n < 0){
return 0;
}
if(n == 0){
return 1;
}
if(n ==1){
return 1;
}
else if(n > 1){
return Function1(n-1) + Function1(n-2);//使用递归的方法
}
return 0;
}
}
class Solution2{
/*本类是通过使用循环的方法来求解斐波那契数列的问题*/
public long Function2(int n){
if(n < 0){
return 0;
}
int[] result2 = {0,1};
if(n < 2){
return result2[n];
}
long num1 = 0;
long num2 = 1;
long sum = 0;
for(int i = 2;i <= n;i++){ // 使用循环的方法
sum = num1 + num2;
num1 = num2;
num2 = sum;
}
return sum;
}
}
public class Fibonacci{
public static void main(String[] args){
System.out.println("请输入一个正整数:");
Scanner sc = new Scanner(System.in);
int a = sc.readInt();
Solution1 s1 = new Solution1();
long start1 = System.currentTimeMillis();
long result1 = s1.Function1(a);
long end1 = System.currentTimeMillis();
System.out.println("递归调用的耗时是:" + (end1 - start1));
System.out.println("最终的结果是:" + result1);
System.out.println("---------------------");
Solution2 s2 = new Solution2();
long start2 = System.currentTimeMillis();
long result2 = s2.Function2(a);
long end2 = System.currentTimeMillis();
System.out.println("循环方法的耗时:" + (end2 - start2));
System.out.println("最终的结果是:" + result2);
}
}
最终的结果如图所示:
**1、**当求斐波那契数列第20个数的时候,两者的对比如下:
可以看出,递归调用耗时为:1,循环的耗时为:0;此时两者还不是很明显。
**2、**当求斐波那契数列第30个数的时候,两者的对比如下:
可以看出,递归调用耗时为:7,循环的耗时为:0;此时两者已经逐渐有差距了。
3、 当求斐波那契数列第40个数的时候,两者的对比如下:
可以看出,递归调用耗时为:521,循环的耗时为:0;此时两者已经有了很大的差距了。
结论
综上所述,求斐波那契数列用循环要比用递归效率要高的多。