void reverse()
{
char c;
scanf("%c", &c);
if(c!='\n')
{
reverse();
printf("%c", c);
}
}
當'c == \ n'時,程序甚至不會進入'if'塊。那麼它最終如何打印轉換後的句子。請解釋'返回'發生的位置以及返回的位置。C - 翻轉句子 - 遞歸 - 無陣列
void reverse()
{
char c;
scanf("%c", &c);
if(c!='\n')
{
reverse();
printf("%c", c);
}
}
當'c == \ n'時,程序甚至不會進入'if'塊。那麼它最終如何打印轉換後的句子。請解釋'返回'發生的位置以及返回的位置。C - 翻轉句子 - 遞歸 - 無陣列
當'c == \ n'時,它將是遞歸的結束,函數不會再調用自己,並返回到最後一次調用,它繼續'printf(「%c」 ,c)',因此打印字符串的最後一個字符,然後返回到第二個最後一個字符,等等。
讓我們手工運行代碼。想象一下,我們輸入"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"
相反。
希望這可以提供一些關於它如何工作的見解。
太棒了!我真的試過這樣做,但不知道什麼時候談到'迴歸'部分,正如我所說的。對不起,如果我錯了。這是您之前說過的調試嗎? – optimist 2015-02-24 02:56:49
您可以將此視爲「精神」調試的一種形式(您可以通過手動或頭腦運行程序)。實際上,我的意思是在計算機上使用調試程序,但是,像gdb,lldb,Visual Studio的調試程序等。這些調試程序可讓您在計算機上逐行執行程序,並觀察發生了什麼(以及爲什麼)。 – Cornstalks 2015-02-24 02:59:22
太棒了!你介意教我如何做?這將有所幫助。感謝:-) – optimist 2015-02-24 03:05:15
爲什麼不先讀完整個句子,將其翻轉,然後將整個顛倒的句子打印出來。步驟2和3可以合併爲一個步驟。這很簡單,你不需要使用遞歸。 – thang 2015-02-24 02:36:18
我寧願認爲OP有作業解決方案,但他不知道爲什麼,因此張貼這個問題。由於這可能不會爲大學生做作業,我很樂意解釋它。 – miushock 2015-02-24 02:40:26
@thang遞歸是我現在正在學習的東西。所以問題是使用遞歸編寫代碼。謝謝。 – optimist 2015-02-24 02:42:27