2017-03-02 76 views
1

任何人都可以幫助我理解這個字符串反轉的工作原理嗎?使用遞歸在C中反轉字符串

#include <stdio.h> 
void reverse(); 

int main() 
{ 
    printf("Enter a sentence: "); 
    reverse(); 

    return 0; 
} 

void reverse() 
{ 
    char c; 
    scanf("%c", &c); 

    if(c != '\n') 
    { 
     reverse(); 
     printf("%c",c); 
    } 
} 

在此代碼中,函數reverse能夠一次獲取輸入句子一個字符,對嗎?如果它不是'\ n',它會再次調用反向函數。所以下一次當第二個字符被拍攝時,第二個字符將會在變量c中,對嗎?

如果是這樣,該代碼如何能夠反轉給定的任何字符串? c中的最終值是什麼?

+6

該函數不會反轉字符串,它只是通過在print語句前仔細放置遞歸調用來反向標準輸入。 – StoryTeller

+0

現在,該學習如何使用調試器,該調試器可讓您逐步完成代碼並允許您檢查變量。但是一張紙和一支鉛筆應該足以弄清楚這是如何工作的。 –

+0

我發誓他們是一個關於每天在本網站上反轉字符串的問題。 – RoadRunner

回答

6

理解這個的關鍵是char c變量是本地的函數。這意味着每次輸入函數時都會將其分配到堆棧中。在第二次和後續調用新的變量的實例在堆棧上創建。這些是獨一無二的,不會互相干擾。

當終止字符\n最終被看到時,該函數在被調用後返回到該行並且該棧被恢復到它在函數被調用之前的狀態。這意味着變量char c將被恢復到之前的值。因此堆棧被打開,字符按照與輸入相反的順序被打印。

一旦reverse()返回main()會有c沒有終值,因爲它所含的堆棧幀將被銷燬。

+0

非常感謝@mhawke對此進行解釋。 –

2

在這個程序中,每當一個字符串(一個字符塊,例如「hello」)被輸入時,每次調用函數reverse()並更新堆棧(push),除非它不得到空。因此,函數將以遞歸方式調用,它將更新堆棧並按下最後輸入的字符數據。最後,當它變爲Null時,它將開始以LIFO(後進先出)順序從堆棧中獲取數據。所以,最後輸入的字符將被首先取出,倒數第二個將被取出。這將發生,直到輸入第一個字符。 查看wikipedia右側的圖片以瞭解Stack的操作。 https://en.wikipedia.org/wiki/Stack_(abstract_data_type)

+0

非常感謝@utpal Shankar向我解釋這個概念。 –