递归和非递归实现斐波拉切数列及性能的比较

    斐波拉切数列指的是这样一个数列:1、1、2、3、5、8、13、21、34·······由此可以得到如下的递推公式:

    F(1) = 1, F(2) = 1, F(3) = F(2) + F(1)  ······· 由此可以计算出第n项的值为: F(n) = F(n-1) + F(n-2) 。其使用递归和非递归的方式实现如下:

public class TestFee {
	/**
	 * 递归方式
	 * @param n 要计算的第n项
	 * @return	返回计算的结果
	 */
	long fa(int n){
		if(n == 1 || n == 2) return 1;
		return fa(n-1)+fa(n-2);
	}
	
	/**
	 * 非递归方式
	 * @param n 要计算的第n项
	 * @return 返回计算的结果
	 */
	long cal(int n){
		//使用变量i记录n-1项
		long i = 1;
		//使用变量j记录n-2项
		long j = 1;
		while(n >= 3){
			//使用第三个变量k记录第n项的值
			long k = i + j;
			j = i;
			i = k;
			n--;
		}
		return i;
	}
	
	public static void main(String[] args) {
		TestFee tf = new TestFee();
		//1.使用递归方式
		//long fa = tf.fa(15);
		//System.out.println(fa);
		//2.使用非递归方式
		long cal = tf.cal(15);
		System.out.println(cal);
	}

}

    以上两种方式都可以实现第n项的值的计算,但经过测试,当计算的n值比较大时(例如当n = 48时),会明显的看到使用递归的方式比使用非递归的方式性能要低下的多,所以在计算此问题时优先选择非递归的方式。

    使用非递归性能低下的原因是:由于计算出第n项的值的方法为: F(n) = F(n-1) + F(n-2),由此递推公式可以看出,当n >= 3的时候,计算每一项都需要拆分成两项,而拆分的两个子项又需要各自拆分成两个子项,这样一来,如果计算的n比较大的时候,最终的计算式子会有很多项,而每一项都需要在内存中分配相应的空间,从而导致运算效率低下。

    以上纯属个人见解,如有问题请多指教。

猜你喜欢

转载自blog.csdn.net/qq_1325508134/article/details/81061605
今日推荐