使用遞歸函數 Temp(n) 計算 (-1)^n,在 while(temp >= 1e-6) 精度要求下,遞歸深度超過 4000 層,導致堆疊溢出,程式無輸出或崩潰。
#include <iostream>
#include <iomanip>
using namespace std;
double computePi(double eps = 1e-6) {
double sum = 0.0;
double term = 1.0; // 當前項值 1/(2k+1)
int sign = 1; // 正負號
int k = 0; // 項索引
while (term >= eps) {
sum += sign * term;
k++;
term = 1.0 / (2 * k + 1);
sign = -sign; // 交替正負
}
return 4 * sum;
}
int main() {
cout << "------------求PI的值-------------" << endl;
cout << "根據 P/4 = 1 - 1/3 + 1/5 - 1/7 ... 精度 0.000001" << endl;
double Pi = computePi();
cout << fixed << setprecision(10) << "PI = " << Pi << endl;
return 0;
}
sign = -sign 交替正負,O(1) 空間複雜度。double 足夠,輸出 setprecision(10) 觀察收斂。M_PI。遞歸適合樹狀、分治結構;簡單級數求和請堅決使用迴圈。