0

我在大学笔记中找到了以下代码来反转 C 中的字符串。我不明白这个例子中的递归是如何工作的,因为它对我来说似乎很神奇!更具体地说,如果我输入单词“one”,程序会打印出单词“eno”。根据解释,该函数递归地从用户那里读取字符,直到用户按下Enter('\n'),然后打印出反转的单词。但是,如果函数最后一次递归调用自身是当用户按下 Enter 并且之后程序无法再次进入函数以调用printf时,如何打印单词?它是否使用某种缓冲区以及它是如何工作的?这是C源代码:

#include <stdio.h>

void readCharsAndReverse(void);

int main (void)
{
    printf ("Give characters to reverse:");
    readCharsAndReverse();
    printf ("\n\n");
    system("PAUSE");
}

void readCharsAndReverse(void)
{
    char ch;
    scanf ("%c", &ch);
    if (ch != '\n')
       readCharsAndReverse();
    printf ("%c", ch);
 }  
4

6 回答 6

1

它起作用了,例如当您输入“one”并按 Enter 时:当您输入 o 时,readCharsAndReverse() 第一次调用该函数并将第一个 ch 值存储到 'o',并且因为再次调用字符,'o' != \n所以函数现在看起来像:readCharsAndReverse()\n

readCharsAndReverse(){
     ch = 'o';
       readreadCharsAndReverse(){
         ch = 'n';
             readreadCharsAndReverse(){
                 ch='e';
                  readreadCharsAndReverse(){
                      ch='\n';

所以因为它是 '\n' 字符,打印函数运行并将从 'e' 打印到 'o' -> 结果是保留字符串

于 2012-10-14T12:48:53.390 回答
1

一旦你输入Enter,你的方法readCharsAndReverse就开始返回,即,首先它会打印最后输入的字符,堆栈上的所有其他递归调用开始被弹出......因此通过以相反的顺序一个接一个地打印所有字符..

就像你把东西放在最下面的架子上,然后移到上面的架子上做同样的事情……当你遇到Enter你把你有的东西贴在墙上,然后回到下面的架子上,把你放在那里的东西贴在上面先前粘贴的内容旁边的墙,依此类推..

于 2012-10-14T12:58:33.750 回答
1

对,我这就是你要找的答案。

你的程序有所谓的堆栈。每次调用函数时,都会在此堆栈(堆栈帧)上创建空间来保存有关函数的信息。这通常是正在修改的任何寄存器(不用担心)、返回地址,或者更确切地说,是调用它的函数,以及函数使用的任何变量。

每次调用 时readCharsAndReverse,都会在堆栈上放置一个新帧。这包含局部变量ch。退出时readCharsAndReverse,当前堆栈帧被删除(弹出),计算机从readCharsAndReverse被调用的位置开始执行(在您的示例中,通常readCharsAndReverse()在行上)。发生这种情况时, 的值将ch保持与您再次调用之前完全相同readCharsAndReverse

于 2012-10-14T12:47:09.583 回答
1

基本上,该函数将一个字符读入其局部变量ch,调用自身并打印ch

这意味着类似的东西;

  • 首次调用的 readCharsAndReverse 读och并调用自身。

  • 第二次调用的 readCharsAndReverse 读nch并调用自身。

  • 第三次调用的 readCharsAndReverse 读ech并调用自身。

  • 第四次调用的 readCharsAndReverse 读取\n返回到第三次调用的 readCharsAndReverse。

  • 第三次调用的 readCharsAndReverse 打印其che返回到第二次调用的 readCharsAndReverse 。

  • 第二次调用的 readCharsAndReverse 打印它的chn返回到第一次调用的 readCharsAndReverse 。

  • readCharsAndReverse 调用第一次打印它cho我们就完成了。

于 2012-10-14T12:47:42.880 回答
0

readCharsAndReverse 在遇到 "\n" 之前不会停止,因此在 "one" 的情况下:扫描 "o"。它不是一个字符,所以它继续到下一个,即“n”,在“e”之后我们得到“\n”。现在我们进入下一行(因为我们来到了我们的基本情况,所以下一行告诉我们打印堆栈中的内容(即“eno”。首先是“e”,其次是“n”,最后是“o”)。

我建议在任何时候编写堆栈时进行更多评分,并查看更多示例。

于 2012-10-14T12:46:32.410 回答
0

通常递归使用堆栈工作。当一个函数被调用时,它会被压入堆栈并重复此过程,直到达到基本条件。最后,当您达到基本条件时,每个功能都会弹出。然后printf语句被执行。

于 2013-08-04T15:05:55.367 回答