首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

斐波那契數列經典應用:兔子繁殖問題 Java 代碼逐行詳細講解

     編輯:程式設計綜合問答

問題重述

一對兔子,出生後第 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);
        }
    }
}

變量演示表 (前 6 個月)

月份 i循環前 f1循環前 f2① f=f2② f2=f1+f2③ f1=f輸出 f2
31 (F1)1 (F2)11+1=2 (F3)12
41 (F2)2 (F3)21+2=3 (F4)23
52 (F3)3 (F4)32+3=5 (F5)35
63 (F4)5 (F5)53+5=8 (F6)58

關鍵點解答

  1. M=24 含義:只是演示計算前 24 個月,**非固定常數**。實際使用可改為用戶輸入 Scanner 或常量 MAX_MONTH;
  2. 循環體邏輯:滾動數組/雙變量迭代。只保留最近兩個月數值,空間複雜度 O(1),時間 O(n);
  3. 為何不遞歸:遞歸 fib(n)=fib(n-1)+fib(n-2) 重複計算指數級,極其低效;迭代是工程標準解法;
  4. 大數處理:第 50 個月超 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);
    }
    

擴展:矩陣快速冪 O(log n) 求第 n 項

// [[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 項即可。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved