2012-09-06 168 views
-3

可能重複:
What is recursion really and explain the output of this program?
What is really happening in this code?我如何解決下面的代碼?

我有一個遞歸函數,我不明白。我甚至不知道代碼是否有效:

int count(int x) // suppose x is 3 
{ 
    if(x>0) 
    { 
    count(--x); 
    printf(x); 
    count(--x); // control reaches here or not? 
    } 
} 

這只是僞代碼。以3作爲初始變量。請根據上下文解釋堆棧的概念。這段代碼讓我困惑了好幾天,而且我也找不到這個代碼的答案。

+7

顯然這是一個很大的功課,因爲許多新手都在問同樣的問題。閱讀一本關於遞歸的好書是最好的建議。在幾分鐘內向不知名的觀衆解釋是不可能的。 –

+3

請注意,您不會從非void函數返回任何內容。這是未定義的行爲。 –

+0

搜索所以遞歸,並找到一些其他答案給這個確切的問題。有很多好的。如果你還不明白,請參考那些更新你的問題。 – Mike

回答

2

好了,只是因爲我需要醒來我的大腦了一下:-)

count(3)將進入功能和呼叫count(2)(2:第二級別)。
count(2)將進入該功能並呼叫count(1)(3:rd級別)。
count(1)將進入功能並呼叫count(0)(4:th級別)。
count(0)將進入功能,但由於x>0是假的,它不會做任何事情,就回到4:日水平,x仍爲0

4:個級別將輸出0,並調用count(-1) (5個等級)

count(-1)將進入功能,但由於x>0是假的,它不會做任何事情,就回到4:日水平,x仍然是-1。
4:第水平返回到3:RD水平,x仍爲1

3:RD水平將輸出1並調用count(0)(4:第水平)

count(0)將進入功能,但由於x>0爲假,它不會做任何事情,只是返回到3:rd級別,其中x仍然是0.
3:rd級別返回到2:nd級別,其中x仍然是2。

2:第二級將輸出2和呼叫count(1)(3:RD水平)

count(1)將進入功能和呼叫count(0)(4:第水平)。
count(0)將進入功能,但由於x>0是假的,它不會做任何事情,只是返回3:RD水平,x仍爲0

3:第三級將輸出0並調用count(-1)( 4:個級別)

count(-1)將進入功能,但由於x>0是假的,它不會做任何事情,只是返回3:RD水平,x仍然是-1。

3:第三屆水平回到2:第二水平,x仍爲1
2:第二級恢復到1:ST水平,我們就大功告成了。

輸出是0 1 2 0

我建議如果你真的想明白這一點,請用count(4)自己試試。

0

這個函數根本不會返回任何東西。我在這裏發佈的這個問題在過去幾天裏出現了可疑的時間。下面是一些註釋工作代碼,以幫助您瞭解:

/*function declaration so that the program can utilize it*/ 
int count(int x); 

/*main routine that calls the function*/ 
int main(void) 
{ 
    count(3); //call the function 
    return 0; 
}  

/*function prototype*/ 
int count(int x) 
{ 
    if(x > 0) 
    { 
     printf("%d", x - 1); //print the value of x - 1 to the screen 
     return count(--x); //Have the function call itself again with a new argument (the value of x after being decremented) 
    } 
    return x;     //x is no longer greater than 0 so return it's value 
} 

請注意使用return在這個例子中,也讀出了什麼return一樣。 現在,這只是一些更正的代碼。理解遞歸函數在做什麼(在我看來)最好的方法是將其寫在紙上。

+0

這與僞代碼不一樣。是的,您發佈了有效的代碼,比Amol Singh的功能更「計數」,但這不是問題。 – stefan