2014-11-23 96 views
1

我有下面的代碼示例,我無法弄清楚它爲什麼顯示。 由於這些都是整數,我知道小數點不顯示。但我預計它會顯示,(.3),(.23)(以相反的順序)。當n低於10時,一切都停在最後的cout之後......對吧?C++遞歸示例解釋

#include <iostream> 
using namespace std; 
void recursion(int n) { 
    if (n < 10) cout << n; 
    else { 
     recursion(n/10); 
     cout << n % 10; 
    } 
} 

int main() { 
    recursion(123); 
    return 0; 
} 
+3

加入了一個調試器,你將會看到發生了什麼 – quantdev 2014-11-23 16:15:00

+0

我從來沒有用過調試器:-) – Thomas 2014-11-23 16:15:32

+0

嘗試將'cout << n%10;'移到遞歸調用之前...; ) – 2014-11-23 16:17:40

回答

5

那麼,你有123 n調用的函數執行語句:

if (n < 10)  // its false, so it continues with else: 
else { 
    recursion (n /10) // recursive call n/10 = 123/10 = 12 (as it's int) 
... 

它會繼續這樣下去,有n爲12

recursion (n/10)  // second recursion call n=12, so n/10 = 1 

那麼遞歸調用功能執行,其中n爲1,因此小於10

 if (n < 10)  // its true 
      cout << n; // 1 gets printed 
     else    // no, the rest is skiped 
     ... 

然後它從遞歸返回。所以我們又回到的背景下,地方n是12.在這方面,要執行下面的語句是:

cout << n %10; // prints 12 % 10, which is 2 

然後,繼續這樣,同樣會打印123%10,這是3。結論,打印的123與輸入的123無關。

我想你想做的事:

... 
else { 
    cout << n % 10;  // first print to see the count down 
    recursion(n/10); // then recurse 
} 

但是你必須使用調試器來學習。只要你不這樣做,就把一些額外的cout想象成發生了什麼。

+0

嗯,好的!所以當n = 123達到遞歸(123/10)時,程序不會忘記n = 123.它只是試圖通過在數字最終可以開始cout << n之前將數字分開來滿足IF語句每個分割結果的%10個語句..? (如果這個問題沒有任何意義,如果沒有,謝謝你的幫助,現在情況會更加清楚!) – Thomas 2014-11-23 16:50:58

+1

是的!而已。在每次遞歸時,函數都會再次執行,但是會有自己的參數和局部變量。這是用堆棧內存完成的。當函數返回時,其所有本地上下文將從堆棧中移除,並且調用函數的上下文將恢復到調用之前的狀態(如果參數是按值傳遞的)。 – Christophe 2014-11-23 17:20:01

+1

這裏有一些額外解釋的鏈接(以及遞歸執行的一個很好的圖形):http://sourcecodemania.com/recursion-in-cpp/ – Christophe 2014-11-23 17:26:18