簡體   English   中英

一種使用C語言中的遞歸來反轉字符串的方法對我來說很奇怪

[英]A way to reverse a string using recursion in C strange to me

我在大學筆記中找到以下代碼來反轉C中的字符串。 我不明白在這個例子中遞歸是如何工作的,因為對我來說這似乎很神奇! 更具體地說,如果我輸入單詞“ one” ,程序將打印出單詞“ eno” 根據解釋,該函數遞歸地從用戶讀取字符,直到用戶按下Enter('\\ n') ,然后打印出反轉的單詞。 但是,如果該函數最后一次遞歸調用自身是在用戶按下Enter時,然后該程序無法再次進入該函數以調用printf,那么如何打印單詞呢? 它是否使用某種緩沖區以及它如何工作? 這是C源代碼:

#include <stdio.h>

void readCharsAndReverse(void);

int main (void)
{
    printf ("Give characters to reverse:");
    readCharsAndReverse();
    printf ("\n\n");
    system("PAUSE");
}

void readCharsAndReverse(void)
{
    char ch;
    scanf ("%c", &ch);
    if (ch != '\n')
       readCharsAndReverse();
    printf ("%c", ch);
 }  

是的,我認為這是您要尋找的答案。

您的程序具有所謂的堆棧。 每次調用函數時,都會在此堆棧(堆棧框架)上創建空間來保存有關該函數的信息。 通常是正在修改的任何寄存器(不必擔心),返回地址(或更確切地說是調用它的函數)以及該函數使用的任何變量。

每次調用readCharsAndReverse ,都會在堆棧上放置一個新框架。 這包含局部變量ch readCharsAndReverse退出時,當前堆棧幀被刪除(彈出),計算機從調用readCharsAndReverse開始執行(在您的示例中,通常在readCharsAndReverse()行上)。 發生這種情況時, ch的值將保持與再次調用readCharsAndReverse之前的值完全相同。

基本上,該函數將一個字符讀入其局部變量ch ,調用自身並打印ch

那意味着

  • 第一次調用readCharsAndReverse會將o讀入ch並調用自身。

  • 第二次調用的readCharsAndReverse將n讀入ch並調用自身。

  • 三次調用的readCharsAndReverse將e讀入ch並調用自身。

  • 第四次調用的readCharsAndReverse讀取\\n返回第三次調用的readCharsAndReverse。

  • 第三次調用的readCharsAndReverse打印其che返回第二次調用的readCharsAndReverse。

  • 第二次調用的readCharsAndReverse打印其chn返回第一次調用的readCharsAndReverse。

  • 第一次調用readCharsAndReverse會打印其cho ,我們完成了。

例如,當您輸入“ one”並按Enter時,它就起作用了:當您鍵入o時,將首次調用readCharsAndReverse()函數並將第一個ch值存儲為'o',因為'o' != \\n因此,再次將readCharsAndReverse()調用到\\n字符,該函數如下所示:

readCharsAndReverse(){
     ch = 'o';
       readreadCharsAndReverse(){
         ch = 'n';
             readreadCharsAndReverse(){
                 ch='e';
                  readreadCharsAndReverse(){
                      ch='\n';

因此,因為它是'\\ n'字符,所以運行打印功能並將其從'e'打印為'o'->結果是保留字符串

一旦輸入Enter ,您的方法readCharsAndReverse就開始返回,即,它首先將打印最后輸入的字符,並且開始彈出堆棧上的所有其他遞歸調用。因此,以相反的順序逐個打印所有字符。

就像您將某些東西放在底部架子上並移到上部架子上做同樣的事情一樣。當您遇到Enter時,將您所擁有的東西粘貼在牆上,然后回到下面的架子上,然后將您存放的所有東西粘貼到上面先前粘貼內容旁邊的牆,等等。

在滿足“ \\ n”之前,不會停止readCharsAndReverse,因此對於“ one”:將掃描“ o”。 它不是一個字符,因此繼續到下一個字符“ n”,在“ e”之后得到“ \\ n”。 現在我們轉到下一行(因為我們進入了基本情況,所以下一行告訴我們打印堆棧中的內容(即“ eno”。首先是“ e”,第二是“ n”,最后是“ o”)。

我建議在編寫堆棧時隨時提出更多建議,並查看更多示例。

通常,遞歸使用堆棧進行工作。 調用函數時,將其壓入堆棧,並重復執行直到達到基本條件為止。 最后,當您達到基本條件時,將彈出每個功能。 然后執行printf語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM