【问题标题】:Reversing string in C using recursion使用递归在C中反转字符串
【发布时间】:2017-03-02 17:45:55
【问题描述】:

谁能帮我理解这个字符串反转是如何工作的?

#include <stdio.h>
void reverse();

int main()
{
    printf("Enter a sentence: ");
    reverse();

    return 0;
}

void reverse()
{
    char c;
    scanf("%c", &c);

    if( c != '\n')
    {
        reverse();
        printf("%c",c);
    }
}

在这段代码中,函数 reverse 能够一次获取输入句子一个字符,对吗?如果它不是 '\n',它会再次调用 reverse 函数。所以下次取第二个字符时,第二个字符将在变量 c 中,对吗?

如果是这样,这段代码如何能够反转给定的任何字符串? c 中的最终值是多少?

【问题讨论】:

  • 这个函数不会反转字符串,它只是通过在 print 语句之前小心地放置递归调用来反向回显标准输入。
  • 现在,是时候学习如何使用调试器了,它可以让您逐步执行代码并检查变量。但是一张纸和一支铅笔应该足以弄清楚这是如何工作的。
  • 我发誓他们是一个关于每天在这个网站上反转字符串的问题。
  • @RoadRunner - 有点像每次工作面试都有一个关于排序数组的问题:)

标签: c string recursion reverse


【解决方案1】:

理解这一点的关键是char c 变量是函数的本地。这意味着每次进入函数时它都会在堆栈上分配。在第二次和后续调用中,变量的 new 实例会在堆栈上创建。它们是独一无二的,不会相互干扰。

当最终看到终止字符\n 时,函数返回到调用后的行,并且堆栈恢复到调用函数之前的状态。这意味着变量char c 将恢复为之前的值。因此,堆栈被展开,字符以相反的输入顺序打印。

一旦reverse() 返回main()c没有最终值,因为包含它的堆栈帧将被销毁。

【讨论】:

  • 非常感谢 @mhawke 对此的解释。
【解决方案2】:

在这个程序中,当输入一个字符串(一个字符块,说“你好”)时,对于每个单个字符,每次调用函数 reverse() 并更新堆栈(push),除非它没有得到无效的。因此,尽可能以递归方式调用该函数,它将更新堆栈并下推最后输入的字符数据。最后,当它获得 Null 时,它将开始以 LIFO(后进先出)的顺序从堆栈中获取数据。因此,最后输入的字符将首先被取出,倒数第二个将是第二个。这将持续到输入第一个字符。 查看维基百科右上角的图片,了解 Stack 的操作。 https://en.wikipedia.org/wiki/Stack_(abstract_data_type)

【讨论】:

  • 非常感谢 @utpal Shankar 向我解释这个概念。
猜你喜欢
  • 2020-06-28
  • 2015-09-27
  • 1970-01-01
  • 2012-09-24
  • 2013-03-20
  • 1970-01-01
  • 2017-07-20
  • 2012-04-01
相关资源
最近更新 更多