#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 點停止?
uj5u.com熱心網友回復:
從 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
uj5u.com熱心網友回復:
第二個 printf 是必要的原因是你想重復你在下降到 0 的程序中列印的內容。看起來你正在添加,但你所做的只是反向重復你的 printf 呼叫。手工或工具的可視化可以幫助建立遞回函式的直覺。請參閱此示例以獲取可視化PrintNumPattern(2, 1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/344888.html
