[英]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.