兔子 (H) 與狐狸 (L) 種群動態:
H[n+1] = H[n] * (1 + a1 - a2 * L[n])
L[n+1] = L[n] * (1 - b1 + b2 * H[n])
參數:a1=0.1, a2=0.01, b1=0.01, b2=0.00002。初始 H[0]=300, L[0]=20。
直接遞歸實現會導致指數級重複計算:getPopH(n) 調用 getPopL(n-1),後者又調用 getPopH(n-2)... 計算第 100 期耗時極長。
public class LotkaVolterra {
private const double A1 = 0.1, A2 = 0.01, B1 = 0.01, B2 = 0.00002;
private const double H0 = 300, L0 = 20;
public static void Simulate(int periods) {
double h = H0, l = L0;
for (int i = 1; i <= periods; i++) {
double nextH = h * (1 + A1 - A2 * l);
double nextL = l * (1 - B1 + B2 * h);
h = nextH;
l = nextL;
}
Console.WriteLine($"Period {periods}: H={h:F2}, L={l:F2}");
}
}
// 調用
LotkaVolterra.Simulate(200); // 瞬間完成
double 保留小數,長期模擬可考慮 decimal 或對數坐標變換。| Period | H (兔子) | L (狐狸) |
|---|---|---|
| 1 | 270.00 | 19.92 |
| 2 | 243.22 | 19.83 |
| 20 | 47.15 | 17.28 |
| 100 | 8.44 | 7.89 |
| 200 | 903.17 | 3.91 |
結果與題目示例完全一致,證明算法正確。