用Java語言編寫菲波那契數列程式
阿新 • • 發佈:2021-01-04
文章目錄
一、瞭解菲波那契數列
- 斐波那契數列,又稱黃金分割數列或兔子數列,該數列為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) + ",");
}
}
}
- 輸出: