1. 程式人生 > >劍指Offer(java+第九題,斐波那契數列)

劍指Offer(java+第九題,斐波那契數列)

思路

  如果直接寫遞迴函式,由於會出現很多重複計算,效率非常底,不採用。

  要避免重複計算,採用從下往上計算,可以把計算過了的儲存起來,下次要計算時就不必重複計算了:先由f(0)和f(1)計算f(2),再由f(1)和f(2)計算f(3)……以此類推就行了,計算第n個時,只要儲存第n-1和第n-2項就可以了。

書裡面有同時提到了兩個問題:

1:青蛙跳臺階;

2:矩形匹配問題

(實際上就是斐波那契數列,這裡不做贅述)

程式碼:

public class Offer09 {
	
	//遞迴,效率很低,面試官不會喜歡
	public long Fibonacci_Recursive(int n){
		if(n<=0)
			return 0;
		if(n==1)
			return 1;
		return Fibonacci_Recursive(n-1) + Fibonacci_Recursive(n-2);
	}
	
	//時間複雜度O(n),主要看這個
	public long Fibonacci(int n){
		int result[] = {0,1};
		if(n<2)
			return result[n];
		long fibNMinusOne = 1;
		long fibNMinusTwo = 0;
		long fibN = 0;
		for(int i = 2;i<=n;i++){
			fibN = fibNMinusOne + fibNMinusTwo;
			fibNMinusOne = fibN;
			fibNMinusTwo = fibNMinusOne;
		}
		return fibN;
	}
	
	public static void main(String[] args) {
		
		Offer09 of9 = new Offer09();
		
		//測試用例
		//1,功能測試(如輸入3,5,10等)
		int n1 = 3;
		System.out.println("輸入數字:"+n1+", 輸出結果:"+of9.Fibonacci(n1));
		int n2 = 5;
		System.out.println("輸入數字:"+n2+", 輸出結果:"+of9.Fibonacci(n2));
		int n3 = 10;
		System.out.println("輸入數字:"+n3+", 輸出結果:"+of9.Fibonacci(n3));
		
		//2,邊界值測試(如輸入0,1,2)
		int n4 = 0;
		System.out.println("輸入數字:"+n4+", 輸出結果:"+of9.Fibonacci(n4));
		int n5 = 1;
		System.out.println("輸入數字:"+n5+", 輸出結果:"+of9.Fibonacci(n5));
		int n6 = 2;
		System.out.println("輸入數字:"+n6+", 輸出結果:"+of9.Fibonacci(n6));
		
		//3,效能測試(輸入較大的數字,如40,50,100等)
		int n7 = 40;
		System.out.println("輸入數字:"+n7+", 輸出結果:"+of9.Fibonacci(n7));
		int n8 = 50;
		System.out.println("輸入數字:"+n8+", 輸出結果:"+of9.Fibonacci(n8));
		int n9 = 100;//運算結果超出了long的範圍,故輸出為0
		System.out.println("輸入數字:"+n9+", 輸出結果:"+of9.Fibonacci(n9));
	}
}

執行結果: