初學者嘗試使用 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。
具體執行流程:
i = 3。digui(3),條件 3 > 1 成立。digui(i--):傳遞給遞歸調用的參數是 3,但此後區域變量 i 變為 2。digui(3) 又進入判斷,再次傳遞 3,導致無限遞歸,最終棧溢出崩潰,根本無法執行到打印邏輯。修復方法是確保遞歸調用時參數實際減小。有兩種常見寫法:
--iif(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;
}
* ** *** ****
if(i > 1),決定何時停止遞歸。digui(i - 1),問題規模逐步縮小。理解「先遞後歸」的執行順序是掌握遞歸打印圖案的關鍵。