F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2) (n≥2)。序列:0,1,1,2,3,5,8,13,21…
long long Fib(int n) {
if (n < 2) return n;
return Fib(n-1) + Fib(n-2); // 指數級複雜度 O(2^n)
}
大量重複計算,n=40已明顯卡頓。
long long Fib(int n) {
long long f[3] = {0, 1, n};
for (int i = 2; i <= n; i++) {
f[2] = f[0] + f[1];
f[0] = f[1];
f[1] = f[2];
}
return f[2];
}
無遞歸開銷,適合大n。
long long Fib(int n) {
long long fib[1000] = {0, 1};
for (int i = 2; i <= n; i++) fib[i] = fib[i-1] + fib[i-2];
return fib[n];
}
缺點:n>999越界,不可移植。
long long Fib(int n) {
if (n == 0) return 0;
long long *fib = new long long[n+1];
fib[0]=0; fib[1]=1;
for (int i=2; i<=n; i++) fib[i]=fib[i-1]+fib[i-2];
long long ret = fib[n];
delete[] fib;
return ret;
}
long long Fib(int n) {
if (n == 0) return 0;
long long *fib = malloc(sizeof(long long)*(n+1));
fib[0]=0; fib[1]=1;
for (int i=2; i<=n; i++) fib[i]=fib[i-1]+fib[i-2];
long long ret = fib[n];
free(fib);
return ret;
}
| 方法 | 時間 | 空間 | 優點 | 缺點 |
|---|---|---|---|---|
| 遞歸 | O(2^n) | O(n)棟 | 代碼極簡 | 極慢,棟溢出 |
| 三變量迭代 | O(n) | O(1) | 最優空間,無分配 | 無歷史值 |
| 固定數組 | O(n) | O(n) | 可隨機訪問歷史 | 上限固定 |
| new/malloc | O(n) | O(n) | 動態適應任意n | 需手動管理、檢查邊界 |
[ F(n+1) ] [1 1]^n [1]
[ F(n) ] = [1 0] * [0]
適合極大n(如10^18)取模場景。