1. 程式人生 > >java實現斐波那契數列的三種方法

java實現斐波那契數列的三種方法

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實現斐波那契數列的三種寫法就全部寫完了,如果大家還有其他方法,歡迎交流~