C 字符串反转使用递归函数

C string reversal using recursive function

您好,当我在 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)

后的 return 秒后打印字母“O”

现在,在打印 char 'O' 之后,它将再次 return 到具有 *a = L 的函数,现在..我的理解是它将继续返回第四个字符 O 和 L.

我在这里错过了什么?

这里的重点是你多次递归调用同一个函数,这样直到找到终止字符的那一刻 none 这些函数调用已经回来了。

但是一旦你击中终止字符,函数调用的堆栈可以说“回滚”,并且每个返回字符的函数调用都会从最后到第打印。

递归是很有用的东西。我将尝试通过给定的示例向您解释(阅读左栏并按照箭头操作)

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 = '[=10=]'   -> 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)