// 遞減迴圈
int factorial1(int n) {
for (int i = n-1; i > 0; i--) n *= i;
return n;
}
// 遞迴(教學用,非生產環境推薦)
int factorial_rec(int n) {
return n <= 1 ? 1 : n * factorial_rec(n-1);
}
int sum1() {
int sum = 0;
for (int a = 1; a <= 10; a++) {
int fact = 1;
for (int b = 1; b <= a; b++) fact *= b;
sum += fact;
}
return sum;
}
int sum2() {
int sum = 0, fact = 1;
for (int i = 1; i <= 10; i++) {
fact *= i; // 利用上一輪結果
sum += fact;
}
return sum;
}
int fact_rec(int n) { return n<=1?1:n*fact_rec(n-1); }
int sum_rec(int n) { return n<=1?1:sum_rec(n-1)+fact_rec(n); }
| 方法 | 時間複雜度 | 特點 |
|---|---|---|
| 雙層迴圈 | O(n²) | 重複計算階乘 |
| 單層累積 | O(n) | **最佳**,動態規劃思想 |
| 遞迴 | O(n²) | 函式呼叫開銷大,堆疊風險 |
#includeint main() { // 單層累積法示範 int sum = 0, fact = 1; for (int i = 1; i <= 10; i++) { fact *= i; sum += fact; printf("%d! = %d, Sum = %d\n", i, fact, sum); } printf("Final 1!+...+10! = %d\n", sum); return 0; }
階乘求和的關鍵在於**重用前一次計算結果**(`fact *= i`),將 O(n²) 降為 O(n)。這是動態規劃/遞推思想的最簡單體現:保存狀態,避免重複計算。