#include <iostream>
using namespace std;
int fac(int n) {
static int f = 1; // 僅初始化一次,保留上次結果
f *= n;
return f;
}
int main() {
for (int i = 1; i <= 5; i++)
cout << i << "!=" << fac(i) << endl;
return 0;
}
/* 輸出:
1!=1
2!=2
3!=6
4!=24
5!=120
*/
原理:利用 static 變量跨函數調用保持狀態,每次調用在上次結果基礎上乘以當前 n。注意:非線程安全,且再次調用需重置。
#include <iostream>
using namespace std;
int fac(int n) {
if (n < 0) return 0;
if (n == 0 || n == 1) return 1;
return n * fac(n - 1);
}
int main() {
for (int i = 1; i <= 5; i++)
cout << i << "!=" << fac(i) << endl;
return 0;
}
優點:邏輯清晰,符合數學定義。缺點:棧深度 O(n),大 n 導致棧溢出。
| 維度 | 靜態累積 | 遞歸 |
|---|---|---|
| 時間複雜度 | O(n) 總調用 | O(n) 單次調用 |
| 空間複雜度 | O(1) | O(n) 棧 |
| 線程安全 | 否 | 是(無共享狀態) |
| 適用場景 | 連續求 1!~n! | 單次求值、教學演示 |
// 迭代版(通用、高效、安全)
long long fac_iter(int n) {
long long r = 1;
for (int i = 2; i <= n; i++) r *= i;
return r;
}