簡體   English   中英

使用遞歸退出條件進行字符串反向

[英]String reverse using recursion exit criteria

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

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

我在這里不明白的是,如果一次又一次調用遞歸函數,則控件何時進入打印功能並打印調用堆棧?

當函數調用自身時,printf會一直處於保留狀態,直到調用函數完成為止。

輸入“ Hi \\ n”后,它將如下所示:

scanf -> H
reverseSentence()
    scanf -> i
    reverseSentence()
        scanf -> \n
        return
    printf -> i
    return
printf -> H
return

單步調試器可以幫助您理解。

為了理解此代碼,讓我們首先看一下不可逆版本:

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

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

它從stdin讀取一個字符,如果該字符不是換行符,則將其寫回。 然后,它不是通過顯式循環,而是通過遞歸隱式循環以讀取和打印下一個字符:

local> echo "The elephants are coming!" | ./a.out
The elephants are coming!local>

該功能是在每次遞歸中讀入並打印一個字符。 現在,如果我們像原始的那樣反轉這兩行的順序:

        reverseSentence(); 
        printf("%c",c); 

除了現在我們要在處理當前字符之前處理下一個字符之外,發生了相同的事情:

local> echo "The elephants are coming!" | ./a.out
!gnimoc era stnahpele ehTlocal>

每次遞歸仍在讀取和寫入一個字符,但是利用了以下事實:首先遞歸,然后處理當前項以相反的順序處理數據。 先處理當前項目,然后進行重新處理,然后按向前的順序處理數據。

暫無
暫無

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

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