一對兔子,出生後第 3 個月起每月產一對,子兔長到第 3 月也開始產,假設不死,求每月兔子總對數。這是經典的**斐波那契數列**問題:F(1)=1, F(2)=1, F(n)=F(n-1)+F(n-2)。
public class RabbitFibonacci {
public static void main(String[] args) {
// 前兩個月直接輸出
System.out.println("第 1 個月的兔子對數: 1");
System.out.println("第 2 個月的兔子對數: 1");
// 變量含義:
// f1 = F(n-2) 上上月對數
// f2 = F(n-1) 上月對數
// f = 臨時變量,用於交換
// M = 要計算的總月數(這裡 24 只是示例,可改為任意正整數)
int f1 = 1, f2 = 1, f, M = 24;
// 從第 3 個月開始循環計算
for (int i = 3; i <= M; i++) {
f = f2; // ① 保存上月對數 (F(n-1))
f2 = f1 + f2; // ② 計算本月對數 F(n) = F(n-2) + F(n-1),結果存入 f2
f1 = f; // ③ 更新上上月對數為舊的上月對數 (F(n-1) → F(n-2))
System.out.println("第 " + i + " 個月的兔子對數: " + f2);
}
}
}
| 月份 i | 循環前 f1 | 循環前 f2 | ① f=f2 | ② f2=f1+f2 | ③ f1=f | 輸出 f2 |
|---|---|---|---|---|---|---|
| 3 | 1 (F1) | 1 (F2) | 1 | 1+1=2 (F3) | 1 | 2 |
| 4 | 1 (F2) | 2 (F3) | 2 | 1+2=3 (F4) | 2 | 3 |
| 5 | 2 (F3) | 3 (F4) | 3 | 2+3=5 (F5) | 3 | 5 |
| 6 | 3 (F4) | 5 (F5) | 5 | 3+5=8 (F6) | 5 | 8 |
Scanner 或常量 MAX_MONTH;fib(n)=fib(n-1)+fib(n-2) 重複計算指數級,極其低效;迭代是工程標準解法;int 範圍,第 93 超 long。生產環境請用 BigInteger:BigInteger f1 = BigInteger.ONE, f2 = BigInteger.ONE, f;
for (int i = 3; i <= M; i++) {
f = f2;
f2 = f1.add(f2);
f1 = f;
System.out.println("第 " + i + " 月: " + f2);
}
// [[1,1],[1,0]]^n = [[F(n+1), F(n)], [F(n), F(n-1)]]
public static BigInteger fibFast(int n) {
BigInteger[][] baseM = {{BigInteger.ONE, BigInteger.ONE}, {BigInteger.ONE, BigInteger.ZERO}};
BigInteger[][] res = matrixPower(baseM, n);
return res[0][1]; // F(n)
}
兔子問題本質是斐波那契數列。**雙變量滾動迭代**是工程首選:O(n) 時間、O(1) 空間、代碼極簡。初學者重點理解 f1, f2 代表「上上月、上月」的語義,以及三步交換更新的順序。實際項目中注意 BigInteger 防溢出,或按需求輸出前 N 項即可。