F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2) (n≥2)。常見變體為 1,1,2,3,5,8…(省略首項 0)。
public class FibonacciDemo {
public static void main(String[] args) {
printFibonacci(10); // 列印前 10 項
}
public static void printFibonacci(int count) {
if (count <= 0) return;
int[] fib = new int[count];
fib[0] = 1;
if (count > 1) fib[1] = 1;
for (int i = 2; i < count; i++) {
fib[i] = fib[i - 1] + fib[i - 2];
}
for (int n : fib) {
System.out.print(n + " ");
}
System.out.println();
}
}
1 1 2 3 5 8 13 21 34 55
| 版本 | 時間複雜度 | 空間複雜度 | 備註 |
|---|---|---|---|
| 遞迴 | O(2^n) | O(n) | 重複計算極多,教學用 |
| 陣列迭代 | O(n) | O(n) | 本文範例,易讀 |
| 兩變數滾動 | O(n) | O(1) | 只保留前兩項,生產環境首選 |
| 矩陣快速冪 | O(log n) | O(1) | 極大 n 時使用 |
public static void printFibonacciO1(int count) {
if (count <= 0) return;
int a = 1, b = 1;
System.out.print(a + " ");
if (count == 1) return;
System.out.print(b + " ");
for (int i = 2; i < count; i++) {
int c = a + b;
System.out.print(c + " ");
a = b;
b = c;
}
System.out.println();
}
第 47 項起超過 int 上限,第 93 項超過 long,實務上請改用 BigInteger:
BigInteger a = BigInteger.ONE, b = BigInteger.ONE;
for (int i = 2; i < count; i++) {
BigInteger c = a.add(b);
a = b; b = c;
}