我在大学笔记中找到了以下代码来反转C中的字符串。我不明白递归在这个例子中是如何工作的,因为它对我来说似乎很神奇!更具体地说,如果我输入单词"一个" ,该程序会打印出单词" 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);
}
答案 0 :(得分:1)
是的,我认为这是你正在寻找的答案。
您的程序具有所谓的堆栈。每次调用函数时,都会在此堆栈(堆栈帧)上创建空间以保存有关函数的信息。这通常是任何被修改的寄存器(不用担心这个),返回地址,或者更确切地说是调用它的函数,以及函数使用的任何变量。
每次调用readCharsAndReverse
时,都会在堆栈上放置一个新帧。这包含局部变量ch
。当readCharsAndReverse
退出时,当前堆栈帧被删除(弹出),计算机从调用readCharsAndReverse
的位置开始执行(在您的示例中,通常在readCharsAndReverse()
行)。发生这种情况时,ch
的值将保持与您再次调用readCharsAndReverse
之前的值完全相同。
答案 1 :(得分:1)
基本上,该函数将字符读入其局部变量ch
,调用自身并打印ch
。
这意味着像;
第一次调用readCharsAndReverse将o
读入ch
并自行调用。
第二次调用readCharsAndReverse将n
读入ch
并自行调用。
第三次调用readCharsAndReverse将e
读入ch
并自行调用。
readCharsAndReverse第四次调用\n
,返回
readCharsAndReverse第三次调用。
第三次调用readCharsAndReverse打印其ch
,e
和返回
readCharsAndReverse第二次调用。
第二次调用readCharsAndReverse打印其ch
,n
和返回
readCharsAndReverse第一次调用。
第一次调用readCharsAndReverse打印其ch
,o
,我们就完成了。
答案 2 :(得分:1)
例如,当您输入“one”并按Enter键时,它有效:
当你输入o时,第一次调用readCharsAndReverse()
函数并将第一个ch值存储到'o',并且因为'o' != \n
所以再次调用readCharsAndReverse()
到{{1}字符,该函数现在看起来像:
\n
因为它是'\ n'字符,打印功能运行并将从'e'打印到'o' - &GT;结果是保留字符串
答案 3 :(得分:1)
一旦你输入Enter
,你的方法readCharsAndReverse
就会开始返回,即,首先它将打印最后输入的字符,并且堆栈上的所有其他递归调用开始被打开...通过打印所有的人物都是颠倒过来的。
就像你在底架上保留一些物品并移到上层架子上做同样的事情......当你遇到Enter
时,你将任何你所拥有的东西贴在墙上然后回到架子下方粘贴无论你保存在那里,在以前粘贴的内容旁边的墙上,等等......
答案 4 :(得分:0)
readCharsAndReverse在“\ n”满足之前不会停止,所以在“one”的情况下: 扫描“o”。它不是一个字符,所以它继续下一个,即“n”,在“e”之后我们得到“\ n”。现在我们转到下一行(因为我们来到了我们的基本情况,所以下一行告诉我们打印堆栈中的内容(这是“eno”。“e”第一个,“n”第二个,“o”最后)。
我更多地重新编写rading,并在任何时刻编写堆栈时看到更多示例。
答案 5 :(得分:0)
通常递归使用堆栈。当一个函数被调用时,它被推入堆栈并重复这一过程,直到达到基本条件。最后,当你达到基本条件时,每个函数都会弹出。然后执行printf
语句。