#include <stdio.h>
// 遞歸計算 n^k
int power_recursive(int n, int k) {
if (k == 0) return 1; // 基線條件:任何數的 0 次冪為 1
if (k == 1) return n; // 基線條件:1 次冪為本身
return n * power_recursive(n, k - 1); // 遞歸步驟
}
int main() {
int n, k;
printf("輸入底數 n 和指數 k: ");
scanf("%d %d", &n, &k);
if (k < 0) {
printf("指數必須為非負整數\n");
return 1;
}
printf("%d^%d = %d\n", n, k, power_recursive(n, k));
return 0;
}
// 原文有問題的版本
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 只在首次調用初始化。後續調用 power_recursive(2,3) 後再調用 power_recursive(3,2) 會基於上次殘留值計算,結果完全錯誤。num,中間結果相互覆蓋。k==0 返回 1,k==1 返回 n。n^k = n * n^(k-1)。int power_tail(int n, int k, int acc) {
if (k == 0) return acc;
return power_tail(n, k - 1, acc * n);
}
// 調用: power_tail(n, k, 1);
int power_iterative(int n, int k) {
int result = 1;
while (k > 0) {
if (k & 1) result *= n; // 快速冪優化:二進制分解指數
n *= n;
k >>= 1;
}
return result;
}
時間複雜度 O(log k),無棧溢出風險,效率最高。