2016-10-21 73 views
-5
void count(int n){ 
    static int d=1; 
    printf("%d",n); 
    printf("%d",d); 
    d++; 
    if(n>1) count(n-1); 
    printf("%d",d); 
} 
int main(){ 
    count(3); 
} 

我是編程新手,所以請幫助我理解,爲什麼在'if'語句爲false並且該函數沒有被遞歸調用之後,爲什麼輸出還包含兩個4'?解釋以下代碼的輸出?

+4

請將輸出添加到問題中。 – MordechayS

+18

現在是瞭解如何使用調試器的最佳時機。使用調試器,您可以逐行瀏覽代碼,同時觀察變量及其值。如果你這樣做,你得到的結果應該有希望變得明顯。 –

+4

@Someprogrammerdude您忘記了Eric Lippert的[如何調試小程序]的必需鏈接(https://ericlippert.com/2014/03/05/how-to-debug-small-programs/);) – George

回答

2

當您進行遞歸調用,你不要過分的控制移交給功能被稱爲永遠的。如果在進行調用的函數中有一些未完成的工作,那麼一旦遞歸調用結束,它將控制回到完成未完成的工作。

在你的情況下,「未完成的業務」是最後的printf呼叫。有三個調用count。一旦第三次調用退出,第二次打印d,即4,然後退出。這反過來又使控制返回到第一個調用,該調用再次打印4

3

它因爲printf("%d",d);在函數結束。

而且這個語句被執行n次。

展開count(3)的遞歸調用,我們可以得到。

3 
1 
count(2) 
d 

關於進一步展開,我們得到了。

3 
1 
    2 
    2 
    count(1) 
    d 
d 

上再次展開,我們得到,

3 
1 
    2 
    2 
     1 
     3 
      ... recursion ends here 
     d 
    d 
d 
+2

最後的printf被調用n次而不是n + 1次。 – 2501

+0

@ 2501,謝謝。已更正,但打印的「d」的最後n + 1值將相同。 – v78

+0

@ ee2的輸出是312213444 –