首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 遞歸求 PI 導致堆疊溢出:改用迴圈輕鬆解決

     編輯:程式設計綜合問答

問題現象

使用遞歸函數 Temp(n) 計算 (-1)^n,在 while(temp >= 1e-6) 精度要求下,遞歸深度超過 4000 層,導致堆疊溢出,程式無輸出或崩潰。

原因分析

  • 每次遞歸調用佔用棧框架,Windows 預設堆疊 1MB,深度約幾千層即耗盡。
  • 萊布尼茨級數收斂極慢,需百萬次迭代才達 1e-6 精度,遞歸完全不適合。

修正方案:改為迴圈計算正負號

#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) 觀察收斂。
  • 若需更高精度/效能,可改用馬青公式、Chudnovsky 算法或現成常數 M_PI。

遞歸適合樹狀、分治結構;簡單級數求和請堅決使用迴圈。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved