斐波那契额数列的代码实现以及分析

什么是斐波那契数列?斐波那契数列就是: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;此时两者已经有了很大的差距了。
结论
综上所述,求斐波那契数列用循环要比用递归效率要高的多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值