这个递归我看不懂啊,求助!!!!!
void print(){
char a;
scanf("%c",&a);
if(a!='#')
print();
if(a!='#')
printf("%C",a);
}
如果输入ABC#,这个函数为什么会逆序输出CBA????这又不是个数组,它是怎么记住a的值的?而且也没有逆序的代码啊?求助大神。。。{:10_266:}
函数print()被调用了四遍(加上void print 本身),在四个不同的局部变量a中从外到内依次写入了abc#,从最后一个局部变量a的值‘#’开始向外跳出,从而逆序输出《在这里是通过四个不同局部变量a来达到一种入栈的效果》 了解递归函数的执行顺序就会明白了。
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循环的。
递归函数有个缺点:栈不够用。如果出现大量的深层递归,系统必须要给函数分配大量的栈来保存局部变量,如果递归的太深,栈就不够了,到时候就会出现程序崩溃的情况。
好了,就写这些了,如果实在不明白也没关系,以后看的代码多了,明白的原理多了,这些自然而然也就会懂了。 楼上说的很明白,幸亏输入时ABC,如果是27个字母,那还展不开了{:10_258:}
页:
[1]