劍指Offer(java+第九題,斐波那契數列)
阿新 • • 發佈:2019-01-10
思路
如果直接寫遞迴函式,由於會出現很多重複計算,效率非常底,不採用。
要避免重複計算,採用從下往上計算,可以把計算過了的儲存起來,下次要計算時就不必重複計算了:先由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)); } }
執行結果: