1. 程式人生 > >裴波那契數列的遞迴實現與非遞迴實現

裴波那契數列的遞迴實現與非遞迴實現

斐波那契數列是數學家列昂納多·斐波那契(Leonardoda Fibonacci[1]  )以兔子繁殖為例子而引入,也稱為“兔子數列”。

指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……

在數學上,斐波納契數列以如下被以遞迴的方法定義:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)

由於遞迴在計算過程中非常慢,所以本文提供了裴波那契數列的非遞迴實現。並且提供時間引數,用以對比兩種方式的效能。

遞迴的思路是套用公式:F(n) = F(n-1) + F(n-2)

非遞迴的方式:每次儲存上一次計算的結果,當計算新的一天時,只需要把儲存的結果相加即可,而不用遞迴了。

public static void main(String[] args) {
		
		long currentTime1 = System.currentTimeMillis();
		System.out.println(fibonacciRecursion(40));
		long endTime1 = System.currentTimeMillis()-currentTime1;
		System.out.println("遞迴方式計算所需時間:"+endTime1);
		
		
		long currentTime2 = System.currentTimeMillis();
		System.out.println(fibonacciNotRecursion(40));
		long endTime2 = System.currentTimeMillis()-currentTime2;
		System.out.println("非遞迴方式計算所需時間:"+endTime2);
		
	}
	
	//典型的裴波那契數列,遞迴方式實現:F(n) = F(n-1) + F(n-2)
	public static long fibonacciRecursion(long day){
		
		if(day == 0){
			return 0;
		}
		
		if(day == 1){
			return 1;
		}
		else {
			return fibonacciRecursion(day-1)+fibonacciRecursion(day-2);
		}
		
	} 
	//非遞迴方式,思路:每次儲存上一次結果
	public static long fibonacciNotRecursion(long day){
		
		if(day == 0){
			return 0;
		}
		
		if(day == 1){
			return 1;
		}
		
		long temp1 = 1;
		long temp2 = 1;
		long end = 0;
		
		for(long i = 2;i <= day;i++){
			end = temp1 + temp2;
			temp2 = temp1;
			temp1 = end;
		}
		
		return end;
		
	}