java實現斐波那契數列的三種方法
阿新 • • 發佈:2018-11-23
Java實現斐波那契數列的三種方法
什麼是斐波那契數列
- 這裡借用一下度孃的一段話:斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……
其規律很明顯,從第3個數開始,每個數都等於它前兩個數的和。
那麼通過java可以如何實現斐波那契數列呢?這裡介紹三種方法。
1.通過遞迴實現
通過程式碼實現以下效果:當你輸入n時,會獲取斐波那契數列的第n個數的值。
public static int fibonacci(int n){ if (n == 1 || n == 2) { //特殊情況,分開討論 return 1; } if (n > 2) { return fibonacci(n - 1) + fibonacci(n - 2); //遞迴呼叫 } return -1; //如果輸入錯誤的n,一律返回-1 }
這種實現方法最簡單,也是很容易就能想到的。但是效率太低了,當n>=40時,你會發現計算時間明顯變長,當n接近50時,idea執行視窗等了半天才反應過來。
注意:由於int的取值範圍有限,最大值為 (2^32)-1 = 2147483647,當n>46的時候,會發生取值範圍溢位的情況,所以這裡如果想要驗證n>46時的計算耗時情況,請將返回值型別int改為long。 例如第2種方法。就將int改為了long。
2.通過for迴圈的方式實現
public static long fibonacci2(int n) { if (n < 1) { return -1; } if (n ==1 || n == 2) { return 1; } long a =1l, b= 1l, c =0l; //定義三個long型別整數 for (int i = 0; i < n - 2; i++) { c = a + b; //第3個數的值等於前兩個數的和 a = b; //第2個數的值賦值給第1個數 b = c; //第3個數的值賦值給第2個數 } return c; }
這種方法相比第1中,明顯計算速度提高了不是一點兩點,哪怕n>10000,都能瞬間完成計算。
3.通過for迴圈和陣列的方式實現
這種實現方式,其實和第2種實現方式類似,只不過把資料都放到了數組裡,可以取出斐波那契數列的第1個一直到第n個的數值。
同樣,這裡採用了long型別,防止溢位。
public static long fibonacci3(int n) { if (n < 1) { return -1; } if (n == 1 || n == 2) { return 1; } long[] arr = new long[n]; arr[0] = arr[1] = 1; //第一個和第二個資料特殊處理 for (int i = 2; i < n; i++) { arr[i] = arr[i -2] + arr[i - 1]; arr[n -1] = arr[i]; //數列第n個數 對應陣列arr[n - 1] 因為陣列下標是從0開始的 } /* for (int a : arr) { System.out.println(a); //可以得到整個的數列資料 }*/ return arr[n - 1]; }
OK,到這裡java實現斐波那契數列的三種寫法就全部寫完了,如果大家還有其他方法,歡迎交流~