嗨,當我在 C 中搜索簡單的字串反轉時,我在 Youtube 中遇到了這段代碼。它使用函式遞回來列印從字串末尾到開頭的字符。
但是,當它到達空終止符時,我對這種語法的作業方式感到困惑。
#include <stdio.h>
int main() {
char a[100];
scanf("%[^\n]s", a);
reverse(a);
return 0;
}
void reverse(char* a){
if(*a){
reverse(a 1);
printf("%c", *a);
}
}
假設我們有輸入“HELLO”
我的理解是,當遞回發生時,最后的 if 陳述句會繼續到最后一個字母,直到它停在 \0 處,這將使 if 陳述句為假,然后才會開始列印字符。
printf("%c", *a);
它將在呼叫 reverse(\0) 后立即列印字母“O”
現在,在 char 'O' 被列印后,它會再次回傳到具有 *a = L 的函式,現在..我的理解是它會不斷地來回移動字符 O 和 L。
我在這里錯過了什么?
uj5u.com熱心網友回復:
遞回是非常有用的東西。我會試著用給定的例子向你解釋它(閱讀左欄并按照箭頭)
We're starting with a pointing to H
*a = H print H and return from recursion
| recursion ^
v |
*a = E print E and return from recursion
| recursion ^
v |
*a = L print L and return from recursion
| recursion ^
v |
*a = L print L and return from recursion
| recursion ^
v |
*a = O print O and return from recursion
| recursion ^
v |
*a = '\0' -> not printing, but returning from recursion
recursion is going to stop here, because *a evaluates to false, so now we're going up with return from recursion (by return I mean end of reverse function)
uj5u.com熱心網友回復:
這里的關鍵是,你已經遞回呼叫同一個函式多次,這樣到什么時候終止字符被發現的那一刻沒有這些函式呼叫已經回傳。
但是,一旦您點擊終止字符,函式呼叫堆疊就會“回滾”,可以這么說,并且每個函式呼叫回傳一個字符,從最后到第一個列印。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/373416.html
