[英]How does this string reverse recursion work?
我通常很好地理解递归,但因为我是新的C函数,如strcpy
和指针,我无法弄清楚这种递归是如何反转字符串的:
char *reverse(char *string)
{
if (strlen(string) <= 1)
return string;
else
{
char temp = *string;
strcpy(string, reverse(string+1));
*(string+strlen(string)) = temp;
return string;
}
}
strcpy
部分对我来说似乎有点复杂,而且这条线的目的是什么:
*(string+strlen(string)) = temp;
?
我意识到在翻转字符串之后你需要将字符串添加到字符串结尾处,但我不确定我是否理解这段代码背后的逻辑。
这段代码效率极低,但它的作用是:
string+1
是指向字符串中第二个字符的指针)。 *(string+strlen(string)) = temp;
)。 *(string+strlen(string)) = temp;
相当于string[strlen(string)] = temp;
如果这更容易理解。
我根本不建议使用这个代码,因为它效率极低 - 它在每次迭代中复制整个字符串(并测量其长度两次),更不用说浪费堆栈空间了。
一个更好的实现将是:
void reverse(char *s) {
char *e = s+strlen(s)-1;
while (e > s) {
char tmp = *s;
*s=*e;
*e=tmp;
s++; e--:
}
}
*(string+strlen(string)) = temp
是所谓的指针算法 - 该代码相当于string[strlen(string)] = temp
。 因此,这会将temp字符放在字符串的末尾。 请注意,字符串仍然保持为零终止,因为reverse()返回与其参数长度相同的字符串。
reverse(string+1)
再次是指针算术,这次与reverse(&string[1])
- 即, reverse()将从第二个字符开始镜像字符串,但是然后strcpy()将它放在开头字符串,覆盖存储在temp中的第一个字符并放在字符串的末尾。
但是,整体代码看起来不必要地复杂且效率低下,所以在抽取如何从中做事的任何课程之前我会三思而后行。
这就是代码的工作原理。 输入字符串分为两部分,第一个字符和其余部分。 第一个字符存储在temp
,其余字符通过递归调用反转。 递归调用的结果放在结果的开头, temp
的字符放在结尾。
string is [1234567890]
temp is 1, string+1 is [234567890]
reverse(string+1) is [098765432], temp is 1
所述strcopy
线是一部分拷贝从结果reverse(string+1)
的开始处string
,和*(string+strlen(string)) = temp
是一部分拷贝temp
在结束string
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.