求帮解释一下C语言题

32、运行下面程序,从键盘输入四个字符xyz#,其输出是(C)#include"stdio.h"main(){voidrecursion();recursion();}v... 32、运行下面程序,从键盘输入四个字符xyz#,其输出是(C ) #include "stdio.h" main() { void recursion(); recursion(); } void recursion() {char c; c=getchar(); putchar(c); if(c!=’#’) recursion(); putchar(c); } A、xyz# B、xyz#xyz# C、xyz##zyx D、xyzxyz 不懂为什么选择c 展开
 我来答
璩卫束运骏
2019-08-22 · TA获得超过3809个赞
知道大有可为答主
回答量:3077
采纳率:34%
帮助的人:222万
展开全部
这个程序最重要的是理解递归,recursion()函数在递归调用recursion(),即调用其本身,因此需要明白递归调用的顺序:
1、其实递归调用在计算机内部是一个先进后出的堆栈,例如:
1)第一次调用recursion(),执行到函数中的调用自己的语句;
2)第二次调用时,将第一次执行到调用recursion()后面的语句压入(PUSH)堆栈(压入的是代码的首地址);
3)第三次调用,将第二次压入堆栈;
4)当第三次执行完毕,从堆栈里弹出(PUT,退栈)第二次执行到的代码的地址,接着执行;
5)直到堆栈弹完。
2、第一次调用recursion函数,执行开始的c=getchar(); putchar(c); 两个语句,输入x,并显示x(这时屏幕上显示只有一个x)
3、执行if判断,输入的不是“#”符号,所以开始第二次调用自己,这是函数最后的putchar(c); 语句还没有执行,于是将这条语句的地址压入堆栈,需要注意的是,此时的变量c存储的是x,这个也被压入堆栈了。为了方便表述我们将这个地址认为表示为“M”
4、由于调用自己,所以第二次调用又从recursion函数开始处执行c=getchar(); putchar(c); 两个语句,这是,你输入的是y,屏幕显示y(这时屏幕上显示xy,其中x是第一次执行函数显示的)
5、接着if判断,不是“#”,又开始第三次调用自己,和第3步一样,最后的putchar(c); 语句没有执行,压入堆栈(变量c存储的是y),我们表示为“N”
6、第三次调用还是执行recursion函数开始的c=getchar(); putchar(c); 两个语句,输入z,显示z(这时屏幕上显示xyz)
7、同上if判断不是“#”,第四次调用自己,第三次最后的putchar(c); 语句没有执行,压入堆栈(变量c存储的是z),我们表示为“P”
8、第四次调用自己时,还是执行recursion函数开始的c=getchar(); putchar(c); 两个语句,输入#,显示#(这时屏幕上显示xyz#)
9、这里要注意了,if判断是“#”,于是不再调用自己,执行第四次调用的最后一个putchar(c); 语句,于是又一次在屏幕上显示#(这时屏幕上显示xyz##)
10、第四次函数调用执行完成,于是返回第三次调用,及开始退栈,执行我们给出的表示“P”的代码,及第三次调用未执行的putchar(c); 语句,而P处变量c存储的是z,于是屏幕上显示z(这时屏幕上显示xyz##z)
11、第三次执行完成,退栈,执行第二次,即我们给出的表示“N"处,而N处变量c存储的是y,于是屏幕上显示z(这时屏幕上显示xyz##zy)
12、第二次执行完毕,退栈,执行第一次,即我们给出的表示“M"处,而M处变量c存储的是x,于是屏幕上显示x(这时屏幕上显示xyz##zyx)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式