gpt4 book ai didi

c - 这个字符串反向递归是如何工作的?

转载 作者:行者123 更新时间:2023-11-30 14:23:39 27 4
gpt4 key购买 nike

我通常非常了解递归,但因为我对 strcpy 和指针等 C 函数不熟悉,所以我无法弄清楚此递归如何反转字符串:

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;

我意识到翻转字符串后,您需要将字符串开头的字符添加到字符串末尾,但我不确定我是否理解这段代码背后的逻辑。

最佳答案

这段代码效率极低,但它的作用是:

  1. 保存原来的第一个字符
  2. 递归地反转字符串的其余部分(string+1 是指向字符串中第二个字符的指针)。
  3. 将(反转的)字符串的其余部分向左复制一个字符。
  4. 将原始第一个字符放在末尾 (*(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--:
}
}

关于c - 这个字符串反向递归是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12663179/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com