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