1. 程式人生 > 其它 >用Java語言編寫菲波那契數列程式

用Java語言編寫菲波那契數列程式

技術標籤:演算法與資料結構java演算法java動態規劃

文章目錄

一、瞭解菲波那契數列

  • 斐波那契數列,又稱黃金分割數列或兔子數列,該數列為0、1、1、2、3、5、8、13、21、34、…,可以看到它的性質是前兩項之和等於後一項
  • 用數學公式表示,即:F(N) = F(N - 1) + F(N - 2), (其中 N > 1且F(0) = 0, F(1) = 1)。
  • 菲波那契數列隨著數列項數的增加,前一項與後一項之比越來越逼近黃金分割的數值0.6180339887……,黃金分割數又在自然界中無處不在,世界著名建築如巴黎聖母院、埃菲爾鐵塔、埃及金字塔等均能從它們身上找到0.618的影子。

二、遞迴演算法

  • 從頂至下進行遞迴運算,並通過記憶化搜尋進行優化
/**
 * 遞迴法計算菲波那契數列
 */
public class Fibonacci {

    // 定義一個儲存數值對應的HashMap: 比如HashMap<0,0>,HashMap<10,55>...
    static HashMap<Integer, Long> map = new HashMap<>();

    public static Long fib(int n) {

        if (n == 0 || n == 1) {
            return
Integer.toUnsignedLong(n); } // 判斷該數值是否已進行計算:未計算進行遞迴計算,已計算直接返回儲存的值 if (!map.containsKey(n)) { map.put(n, fib(n - 1) + fib(n - 2)); } return map.get(n); } public static void main(String[] args) { for(int j=0;j<44;j++) { System.
out.print(fib(j)+","); } } }
  • 輸出:
    在這裡插入圖片描述

三、動態規劃演算法

  • 動態規劃能解決子問題重複的問題,該演算法與遞迴演算法的從頂至下正好相反,通過自底向上進行迭加運算
/**
 * 動態規劃法計算菲波那契數
 */
public class Dymaic {

    public static Long fib(int n) {
        Long f0 = 0L, f1 = 1L;
        Long result = n == 0 ? f0 : f1;
        for (int i = 2; i <= n; i++) {
            // 從下向上依次疊加計算,每次由位於它之前的兩個斐波那契數相加
            result = f0 + f1;
            f0 = f1;
            f1 = result;
        }
        return result;
    }

    public static void main(String[] args) {
        for (int j = 0; j < 44; j++) {
            System.out.print(fib(j) + ",");
        }

    }

}
  • 輸出:
    在這裡插入圖片描述