递归反向输出字符串

忆年华 2015-03-21 06:23:06
#include <stdio.h>
print()
{
char a;
scanf("%c",&a);
if(a != '#') print();
if(a != '#') printf("%c",a); //这一块是怎样输出的
}
main()
{
print();
}
...全文
272 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-03-23
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
fly_dragon_fly 2015-03-23
  • 打赏
  • 举报
回复
一般是建议通过名字来理解这个函数的,不过显然这个名字过于简朴,那就直接用递归树来理解了,假设输入“123#” '1' ->print() '2' -> print() '3' -> print() '#' 从此返回 每个返回都要执行 if(a != '#') printf("%c",a); 从而完成逆序输出
cysccnu 2015-03-21
  • 打赏
  • 举报
回复
递归调用与一般调用的区别就在于此。 函数在调用另一个函数时,会开辟空间生成调用函数栈帧和被调用函数栈帧,调用函数会push保存寄存器如eax,edx,ecx,被调用函数也会push保存寄存器到栈中,比如edi,ebx,esi,ebp,esp,所有的中间值都保存在每一个调用所对应的栈帧中。在调用结束时pop恢复这些寄存器,同时返回到之前保存的调用函数地址,这样一步步逆着原来的顺序返回。 如果是一般的函数调用,就只需恢复寄存器然后执行ret指令返回;但是在递归调用时,除了要恢复寄存器,还要执行一些含有递归意义的指令,否则只是把中间的值保存,而没有利用, 这里 if(a != '#') printf("%c",a); 的作用就是把每个值打印出来。这一句就是你利用递归需要达成的目的。 举个栗子,如果是阶乘,比如5!,5,4,3,2,1这些值都保存在每次调用对应的栈帧中,在调用结束时每次返回除了恢复寄存器,还要计算i*(i-1)!,i = 2,3,4,5。
纵横车 2015-03-21
  • 打赏
  • 举报
回复
比如输入“abcd#”, 输入‘a’后先if(a != '#') print();继续递归接收下一个字符; 输入‘b’后继续if(a != '#') print();递归接收下一个; 输入‘c’继续递归 输入‘d’继续递归 输入‘#’后if(a != '#') print();if(a != '#') printf("%c",a); 均不被执行,函数结束,返回上一层递归 返回到输入‘d’的那一层,执行if(a != '#') printf("%c",a);输出‘d’,函数结束,返回上一层 返回到输入‘c’的那一层,执行if(a != '#') printf("%c",a);输出‘c’,返回上一层 ...
忆年华 2015-03-21
  • 打赏
  • 举报
回复
这个递归输入懂,到那时在输出的时候就不懂了,

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧