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

C 語言遞歸求階乘:缺少基線條件導致棧溢出歸零

     編輯:程式設計綜合問答

錯誤代碼


int sum2(int n) {
    int sum = 0;
    if (n < 0) printf("error\n"); // 缺少 return
    // else if (n == 0 || n == 1) sum = 1; // 被註釋
    else sum = sum2(n - 1) * n;
    return sum;
}

執行流程

  1. 調用 sum2(5) → 遞歸至 sum2(0) → sum2(-1) … 無限遞歸。
  2. 直到棧溢出或 n 溢出變負,觸發 if (n < 0) 打印 error。
  3. 但無 return,繼續執行 sum = sum2(n-1)*n,sum 為 0,層層返回 0。

正確版


int fact(int n) {
    if (n < 0) return -1; // 錯誤碼
    if (n == 0 || n == 1) return 1; // 基線條件:必須在遞歸調用前
    return n * fact(n - 1);
}

遞歸三要素

  1. 基線條件:最簡情況直接返回,不再遞歸。
  2. 遞歸調用:問題規模縮小,向基線條件收斂。
  3. 返回值傳遞:子問題結果組合為當前問題結果。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved