簡體   English   中英

不理解 C 中的遞歸函數

[英]Not understanding a recursive function in C

#include <stdio.h>

void PrintNumPattern(int x, int y)
{
  if (x > 0) 
  {
        printf("%d ", x);
        PrintNumPattern(x - y, y);
        printf("%d ", x);//idk why this makes it work...why does it add?
    } else {
       printf("%d ", x); 
    }
 
} 

int main(void) {
   int num1;
   int num2;
   
   scanf("%d", &num1);
   scanf("%d", &num2);
   PrintNumPattern(num1, num2);
}

所以目前我正在學習遞歸及其工作原理。 上面的代碼應該得到一個輸入,例如12, 3然后輸出12 9 6 3 0 3 6 9 12到目前為止我很困惑。 為什么我發表評論的 printf 開始在 0 之后添加? 該程序只被告知減而不加。 程序如何知道在 12 點停止?

從 0 開始添加?

它從不添加任何東西。 只是在第一個條件中有兩個printf調用打印相同的數字 - 一次在遞歸調用之前,一次在遞歸調用之后。

程序如何知道在 12 點停止

遞歸調用在 0 處停止。然后它返回到將打印其編號的父調用。

如果你寫出調用樹,它會有所幫助。 我試圖將其可視化,如下所示。 每個縮進代表一個來自父函數的函數調用。 在右側列中,我顯示了結果輸出。

PrintNumPattern(12, 3)
    printf(12) -------------------------> 12
    PrintNumPattern(9, 3)
        printf(9) ----------------------> 9
        PrintNumPattern(6, 3)
            printf(6) ------------------> 6
            PrintNumPattern(3, 3)
                printf(3) --------------> 3
                PrintNumPattern(0, 3)
                    printf(0) ----------> 0
                printf(3) --------------> 3
            printf(6) ------------------> 6
        printf(9) ----------------------> 9
    printf(12) -------------------------> 12

另一種可能(也可能沒有)有用的看待它的方法是僅可視化遞歸調用的一個級別。 這清楚地表明沒有“加法”,只有重復。

PrintNumPattern(12, 3)
    printf(12) -------------------------> 12
    PrintNumPattern(9, 3) --------------> 9 6 3 0 3 6 9
    printf(12) -------------------------> 12

第二個 printf 是必要的原因是你想重復你在下降到 0 的過程中打印的內容。看起來你正在添加,但你所做的只是反向重復你的 printf 調用。 手工或工具的可視化可以幫助建立遞歸函數的直覺。 有關PrintNumPattern(2, 1)的可視化, PrintNumPattern(2, 1) 示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM