【发布时间】:2013-06-14 21:52:33
【问题描述】:
我无法理解这个反向函数的工作原理。我已经尝试在纸上一步一步地弄清楚代码的作用,但这对我来说没有意义。我对代码所做的最好(尽管很粗略)的解释是:
http://s7.postimg.org/632xhovwr/recursion_confusion.png
#include <stdio.h>
#include <string.h>
#define MAX 1000
void reverse(char s[]);
main()
{
char str[] = "remotes";
printf("Before: %s\n",str);
reverse(str);
printf("After: %s\n",str);
system("Pause");
return 0;
}
void reverse(char s[])
{
static int i = 0, n;
char c = s[i];
if (c != '\0') {
++i;
reverse(s);
s[n-i] = c;
--i;
}
else {
n = i;
}
}
当递归是代码的最后一步时,通常我不会遇到递归函数的问题,因为您应用递归直到某些终止条件和某种向后级联。但是当递归调用前后都有代码时,事情就变得更加混乱了。
【问题讨论】:
-
我不确定为什么这个函数甚至需要递归。您所要做的就是从第一个字符循环到字符串的一半,将每个字符与其另一半的镜像交换。
-
@RobertHarvey 可以作为递归练习吗?
-
@vidit 不,它是
static,并且在到达0终止符时设置之前没有使用。 -
@RobertHarvey Daniel Fischer 所说的;这是基于 K&R 的一个练习。我知道不用递归定义更简单。
-
递归函数通过
static变量在调用之间传递状态,因为它不想弄脏它的公共接口。真的很优雅。