一對兔子,從出生後第 3 個月起每個月生一對兔子,小兔子長到第 4 個月後也開始生殖。假設兔子不死,求第 n 個月兔子總對數。這是經典的費波那契數列(Fibonacci Sequence)問題:
F(1)=1, F(2)=1, F(n)=F(n-1)+F(n-2) (n>2)
public class Exp2 {
public static void main(String[] args) {
for (int i = 1; i <= 20; i++) {
System.out.println("第 " + i + " 個月:" + f(i) + " 對");
}
}
public static int f(int x) {
if (x == 1 || x == 2) return 1;
return f(x - 1) + f(x - 2);
}
}
public class Exp2 {
public static void main(String[] args) {
MathUtil math = new MathUtil();
for (int i = 1; i <= 20; i++) {
System.out.println("第 " + i + " 個月:" + math.f(i) + " 對");
}
}
}
class MathUtil {
public int f(int x) {
if (x == 1 || x == 2) return 1;
return f(x - 1) + f(x - 2);
}
}
| 實作方式 | 時間複雜度 | 空間複雜度 | 適用場景 |
|---|---|---|---|
| 遞迴(上述) | O(2^n) | O(n) 呼叫堆疊 | 教學示範、n < 30 |
| 記憶化遞迴 | O(n) | O(n) | 中等 n、程式碼簡潔 |
| 迭代(雙變數滾動) | O(n) | O(1) | 生產環境、大 n |
| 矩陣快速冪 | O(log n) | O(1) | 極大 n(>10^9) |
public static long fibIterative(int n) {
if (n <= 2) return 1;
long a = 1, b = 1;
for (int i = 3; i <= n; i++) {
long c = a + b;
a = b;
b = c;
}
return b;
}
Java 預設堆疊深度約 10,000 層左右,f(50) 即可能導致 StackOverflowError。實務上請改用迭代或 BigInteger 處理大數。