鱼C论坛

 找回密码
 立即注册
查看: 2922|回复: 3

这个递归我看不懂啊,求助!!!!!

[复制链接]
发表于 2016-10-7 10:53:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
void print()
{
        char a;
        scanf("%c",&a);
        if(a!='#')
        print();
        if(a!='#')
        printf("%C",a);
}
如果输入ABC#,这个函数为什么会逆序输出CBA????这又不是个数组,它是怎么记住a的值的?而且也没有逆序的代码啊?求助大神。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-8 02:45:35 From FishC Mobile | 显示全部楼层
函数print()被调用了四遍(加上void print 本身),在四个不同的局部变量a中从外到内依次写入了abc#,从最后一个局部变量a的值‘#’开始向外跳出,从而逆序输出《在这里是通过四个不同局部变量a来达到一种入栈的效果》
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-8 09:59:22 | 显示全部楼层
了解递归函数的执行顺序就会明白了。
scanf()  输入A
printf()-----scanf()   输入B
                printf()------scanf()    输入C
                                 printf()--------scanf()   输入#
                                                     因为输入了#号,函数开始退出,不再printf,不再递归下去。
                                                     if(a!='#')
                                                          printf("%c", a)     因为非#过滤,第一次不打印#
                                 printf("%c", a)  递归子函数执行完毕,顺序执行到这里,开始第一次输出:C
                printf("%c", a)  子函数再次执行完毕,顺序执行到这里开始第二次输出:B
printf("%c", a)   最终子函数全部执行完毕,顺序执行到根函数中的打印:A

以上就是递归执行过程,这个比较绕,多在脑海里重现一下过程,试着把递归函数一个一个展开,然后终止到退出条件,一切都是按照顺序执行的。执行完子函数,最后退回到根函数,所以才会有种倒过来的感觉。
其实递归就像是阶梯一样,先下去,在上来。
   +   A                          +
       +   B                  +
            +  C         +
                   +  #
只不过每个阶梯的执行过程都是一样的,大家为了偷懒,正好发明了递归。
每个递归函数都可以改写为for循环或者while循环的。
递归函数有个缺点:栈不够用。如果出现大量的深层递归,系统必须要给函数分配大量的栈来保存局部变量,如果递归的太深,栈就不够了,到时候就会出现程序崩溃的情况。

好了,就写这些了,如果实在不明白也没关系,以后看的代码多了,明白的原理多了,这些自然而然也就会懂了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-10-8 10:05:36 | 显示全部楼层
楼上说的很明白,幸亏输入时ABC,如果是27个字母,那还展不开了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 13:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表