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

C語言遞歸打印三角形失敗?核心錯誤在參數遞減邏輯

     編輯:程式設計疑難解答

問題場景

初學者嘗試使用 C 語言遞歸函數打印三角形圖案,但程序運行後無輸出或結果錯誤。原始代碼片段如下:

#include <stdio.h>

void digui(int i) {
    if(i > 1)
        digui(i--);  // 關鍵錯誤在此行
    for(int j = 0; j < i; j++)
        printf("*");
    printf("\n");
}

void main() {
    int i;
    scanf("%d", &i);
    digui(i);
}

錯誤分析:後置遞減運算符的陷阱

核心問題在於 digui(i--) 這行代碼。在 C 語言中,i-- 是後置遞減運算符,其行為是:先使用當前值參與運算,再將變量值減 1。

具體執行流程:

  1. 假設輸入 i = 3。
  2. 調用 digui(3),條件 3 > 1 成立。
  3. 執行 digui(i--):傳遞給遞歸調用的參數是 3,但此後區域變量 i 變為 2。
  4. 遞歸調用 digui(3) 又進入判斷,再次傳遞 3,導致無限遞歸,最終棧溢出崩潰,根本無法執行到打印邏輯。

正確寫法:使用預遞減或表達式

修復方法是確保遞歸調用時參數實際減小。有兩種常見寫法:

方案一:預遞減運算符 --i

if(i > 1)
    digui(--i); // 先減 1,再傳遞新值 (2)

方案二:直接使用表達式 i - 1(推薦)

if(i > 1)
    digui(i - 1); // 不修改原變量,直接傳遞計算值

方案二更安全、可讀性更強,避免了對區域變量的副作用修改。

完整修正代碼

#include <stdio.h>

void digui(int i) {
    if(i > 1)
        digui(i - 1); // 修正點:傳遞 i-1,而非 i--
    
    for(int j = 0; j < i; j++)
        printf("*");
    printf("\n");
}

int main() { // 標準 main 返回 int
    int i;
    printf("請輸入三角形行數: ");
    scanf("%d", &i);
    digui(i);
    return 0;
}

運行結果示例 (輸入 4)

*
**
***
****

知識延伸:遞歸的三要素

  1. 終止條件:if(i > 1),決定何時停止遞歸。
  2. 遞歸調用:digui(i - 1),問題規模逐步縮小。
  3. 業務邏輯:打印星號循環,在遞歸返回時逐層執行(先遞後歸),形成從小到大的三角形。

理解「先遞後歸」的執行順序是掌握遞歸打印圖案的關鍵。

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