int number_power(const int n, int k) {
static int num = 1; // 靜態區域變數:生命週期贯穿整個程式,僅初始化一次!
num = num * n;
if (k > 1) { k--; number_power(n, k); }
return num;
}
嚴重缺陷:static int num = 1 導致:
number_power(2,3) 回傳 8 (正確)。number_power(3,2),num 保留上次值 8 → 計算 8*3*3=72 (錯誤,應為 9)。// 尾遞迴優化友善
long long power_recursive(int n, int k) {
if (k == 0) return 1;
if (k == 1) return n;
long long half = power_recursive(n, k / 2);
if (k % 2 == 0) return half * half;
else return half * half * n;
}
// 或簡單版(教學用)
int power_simple(int n, int k) {
if (k == 0) return 1;
return n * power_simple(n, k - 1);
}
| 特性 | 原始(static) | 正確遞迴 |
|---|---|---|
| 可重入/執行緒安全 | 否 | 是 |
| 多次呼叫正確性 | 錯誤 | 正確 |
| 時間複雜度 | O(k) | O(k) 或 O(log k) (快速冪) |
| 溢位處理 | 無 | 建議用 long long + 檢查 |
long long power_iterative(int n, int k) {
long long result = 1;
long long base = n;
while (k > 0) {
if (k & 1) result *= base;
base *= base;
k >>= 1;
}
return result;
}
O(log k) 為大指數標準解法。