對於初學者來說,將參數聲明爲unsigned int
會更準確。否則,用負值減小參數可能會導致輸出序列很長。
在函數的每個遞歸調用中,參數首先減少,減小後打印輸出。
func(--x);
^^^^
printf("%d\t",x);
所以,如果因爲參數降低的功能最初被稱爲使用參數等於2
然後將其輸出值1
。
因此
func(2) --> outputs 1
func(1) --> outputs 0
func(0) --> outputs nothing
只有最內層的函數調用,首先輸出其值。
如果你想一下,產量將看起來像
0 1 2
則因爲它是在這個示範項目顯示的功能應該被定義
#include <stdio.h>
void func(unsigned int x)
{
if (x) func(x - 1);
printf("%u\t", x);
}
int main(void)
{
func(2);
putchar('\n');
}
功能輸出
0 1 2
函數不同於原始函數的是參數本身不是de在函數調用中摺痕。它保持其價值不變。
if (x) func(x - 1);
^^^^^^ the variable x itself is not changed
如果發生在方法開始時的遞歸調用,它被稱爲遞歸頭。該方法在跳入下一個遞歸調用之前保存狀態。
這聽起來像你可能需要學習如何使用調試器來遍歷代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:** [如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver
行'if(x == 0 )返回;'不可能更清楚。如果'x'是'0',那麼不要執行此功能的其餘部分。 –
作爲下一個練習 - 交換'printf'和'func'行。然後去閱讀關於* head遞歸*和* tail遞歸*。 –