求解释这段代码,功能:如输入123$,输出显示$321,但是看不懂调用自身如何实现的,求大侠解释!!
rev(){charc;c=getchar();if(c=='$')printf("%c",c);else{rev();printf("%c",c);}}...
rev()
{
char c;
c=getchar();
if(c=='$')printf("%c",c);
else
{
rev();
printf("%c",c);
}
} 展开
{
char c;
c=getchar();
if(c=='$')printf("%c",c);
else
{
rev();
printf("%c",c);
}
} 展开
展开全部
这段代码编写的很精巧。是一个递归程序。
rev()的流程是这样的:
1、接受一个输入的字符c;
2、判断这个字符是否为’$',如果是'$',则认为是接收到了最后一个字符,输出这个字符'$',流程结束;
3、如果不是'$',则继续执行rev(),然后输出接收到的字符c,流程结束。
第3步中,执行rev()是一个递归调用,实际上是从尾到头输出除了先接收的这个字符c之外的其他字符,然后输出这个字符c,就达到了倒序输出的目的。
比如输入“a$”这个字符串,rev()先接收了字符'a'到变量c中,判断不是'$',进入第3步,继续执行rev(),这次执行的rev()接收的是'$',那么直接输出'$',结束这次rev()的调用,然后继续执行第一次rev()的语句,输出接收到的字符c,也就是'a',流程结束,这样输出结果就是"$a"。
如果输入更多,比如输入"abcd$",那么就是先接收'a',再调用rev()对后面的输入"bcd$"进行处理,最后输出'a';而调用rev()对"bcd$"的处理,就是先接收'b',再调用rev()对后面的输入"cd$"进行处理,最后输出'b';一直如此,直到调用rev()处理接收的最后的字符'$'。所以输出的结果自然就是"$dcba“了。
递归是使用堆栈来实现的。而这个将输入字符串倒序输出与堆栈是一个原理,就是”先进后出“,所以用递归实现输入字符串倒序输出是正合适的。
rev()的流程是这样的:
1、接受一个输入的字符c;
2、判断这个字符是否为’$',如果是'$',则认为是接收到了最后一个字符,输出这个字符'$',流程结束;
3、如果不是'$',则继续执行rev(),然后输出接收到的字符c,流程结束。
第3步中,执行rev()是一个递归调用,实际上是从尾到头输出除了先接收的这个字符c之外的其他字符,然后输出这个字符c,就达到了倒序输出的目的。
比如输入“a$”这个字符串,rev()先接收了字符'a'到变量c中,判断不是'$',进入第3步,继续执行rev(),这次执行的rev()接收的是'$',那么直接输出'$',结束这次rev()的调用,然后继续执行第一次rev()的语句,输出接收到的字符c,也就是'a',流程结束,这样输出结果就是"$a"。
如果输入更多,比如输入"abcd$",那么就是先接收'a',再调用rev()对后面的输入"bcd$"进行处理,最后输出'a';而调用rev()对"bcd$"的处理,就是先接收'b',再调用rev()对后面的输入"cd$"进行处理,最后输出'b';一直如此,直到调用rev()处理接收的最后的字符'$'。所以输出的结果自然就是"$dcba“了。
递归是使用堆栈来实现的。而这个将输入字符串倒序输出与堆栈是一个原理,就是”先进后出“,所以用递归实现输入字符串倒序输出是正合适的。
追问
比如输入ab$,先判断第一个字符a不等于$,然后执行后面b$,这个时候进入esle里面的rev (),等rev ()把b$处理完之后(处理b$的时候又进入了一次rev ()然后输出$,再输出b,)再输出a ,这个是我按照你说的理解的,谢谢你!
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询