[英]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.