繁体   English   中英

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

[英]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;

我意识到在翻转字符串之后你需要将字符串添加到字符串结尾处,但我不确定我是否理解这段代码背后的逻辑。

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

  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--:
  }
}

*(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM