2015-02-24 35 views
0
void reverse() 
{ 
    char c; 
    scanf("%c", &c); 
    if(c!='\n') 
    { 
     reverse(); 
     printf("%c", c); 
    } 
} 

當'c == \ n'時,程序甚至不會進入'if'塊。那麼它最終如何打印轉換後的句子。請解釋'返回'發生的位置以及返回的位置。C - 翻轉句子 - 遞歸 - 無陣列

+0

爲什麼不先讀完整個句子,將其翻轉,然後將整個顛倒的句子打印出來。步驟2和3可以合併爲一個步驟。這很簡單,你不需要使用遞歸。 – thang 2015-02-24 02:36:18

+0

我寧願認爲OP有作業解決方案,但他不知道爲什麼,因此張貼這個問題。由於這可能不會爲大學生做作業,我很樂意解釋它。 – miushock 2015-02-24 02:40:26

+0

@thang遞歸是我現在正在學習的東西。所以問題是使用遞歸編寫代碼。謝謝。 – optimist 2015-02-24 02:42:27

回答

3

當'c == \ n'時,它將是遞歸的結束,函數不會再調用自己,並返回到最後一次調用,它繼續'printf(「%c」 ,c)',因此打印字符串的最後一個字符,然後返回到第二個最後一個字符,等等。

1

讓我們手工運行代碼。想象一下,我們輸入"foobar"。我們會按照計算機處理的每一條指令。如果我們遞歸,那麼隨着我們對事物的追蹤,我們會縮小。如果我們這樣做,我們可以看到執行的指令序列爲:

scanf() // reads 'f' 
if ('f' != '\n') 
    scanf() // reads 'o' 
    if ('o' != '\n') 
    scanf() // reads 'o' 
    if ('o' != '\n') 
     scanf() // reads 'b' 
     if ('b' != '\n') 
     scanf() // reads 'a' 
     if ('a' != '\n') 
      scanf() // reads 'r' 
      if ('r' != '\n') 
      scanf() // reads '\n' 
      if ('\n' != '\n') 
      printf('r') 
     print('a') 
     print('b') 
    print('o') 
    print('o') 
print('f') 

每個凹口是reverse()遞歸調用。如您所見,printf()命令的順序與輸入"foobar"相反。

希望這可以提供一些關於它如何工作的見解。

+0

太棒了!我真的試過這樣做,但不知道什麼時候談到'迴歸'部分,正如我所說的。對不起,如果我錯了。這是您之前說過的調試嗎? – optimist 2015-02-24 02:56:49

+0

您可以將此視爲「精神」調試的一種形式(您可以通過手動或頭腦運行程序)。實際上,我的意思是在計算機上使用調試程序,但是,像gdb,lldb,Visual Studio的調試程序等。這些調試程序可讓您在計算機上逐行執行程序,並觀察發生了什麼(以及爲什麼)。 – Cornstalks 2015-02-24 02:59:22

+0

太棒了!你介意教我如何做?這將有所幫助。感謝:-) – optimist 2015-02-24 03:05:15