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

C 語言遞歸求平方根:缺少返回類型與無限遞歸導致棧溢出

     編輯:程式設計綜合問答

現象分析

程序運行出現黑框,輸入數值後直接退出,無輸出結果。

代碼雙重缺陷

  1. 函數缺少返回類型聲明:mysqrt() 未聲明返回 double,舊標準默認 int,導致類型不匹配與未定義行為
  2. 無限遞歸無基線條件:函數內部無條件調用自身,缺乏收斂判斷(如精度閾值),必然導致棧溢出崩潰

修正版牛頓迭代法

#include 
#include 

double mysqrt(double x) {  // 明確返回類型
    if (x < 0) return -1;  // 錯誤處理
    double guess = x / 2.0;
    while (fabs(guess * guess - x) > 1e-6) {  // 迭代終止條件
        guess = (guess + x / guess) / 2.0;
    }
    return guess;
}

int main() {
    double a;
    printf("輸入非負數: ");
    scanf("%lf", &a);
    printf("平方根 ≈ %.6f\n", mysqrt(a));
    return 0;
}

遞歸轉迭代原則

  • 數值計算類遞歸首選迭代,避免棧溢出且效率更高
  • 必須設置明確終止條件(精度、最大迭代次數)
  • 邊界情況(負數、零、極大值)顯式處理

編譯器未報錯不代表代碼正確,C 語言隱式 int 早已廢棄,務必顯式聲明返回類型!

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