反向输出你输入的字符串。
要理解递归,我觉得最好先理解堆栈,然后搞懂函数调用时的堆栈过程。
首先不说递归,看看两层的函数调用时怎样实现的。作为例子,用个数学运算的程序演示:输出一个数的平方的两倍。
程序代码:
/*输出一个数的两倍*/
#include<stdio.h>
int fun1(int x);/*此函数计算平方的两倍*/
int fun2(int y);/*此函数计算平方*/
int main()
{
int n=3;
printf("n=%d\n",fun1(n));
system("pause");
return 0;
}
int fun1(int x)
{
x=2*fun2(x);
return x;
}
int fun2(int y)
{
y=y*y;
return y;
}
主函数调用fun1()函数,但fun1()函数无法完成所以fun1()函数继续调用fun2()函数。
在调用过程中,系统要为每个调用的函数开辟内存空间,结束后释放内存空间。
首先是fun1(),fun1()需要的是一个整形变量的空间,即x的空间,但fun1()没能就此返回函数值,因为自己没完成,它继续调用fun2(),于是系统又为fun2()开辟了一个整形变量的空间。fun2()直接执行完返回函数值(它没有调用函数了),系统收回它占据的空间,然后fun1()也返回函数值,系统收回它的空间。
这就像堆栈一样,先入栈,然后出栈。遵循先进后出的原则。
递归也如此,只不过函数是一直调用自身罢了,每调用一次,就得开辟一次空间。直至某个使他无法继续的条件成立为止,如果没有使他停止的条件设置,那就是无限递归了,和死循环一样。
你的程序中palin()函数每次调用时,如果n不小于0,便读入一个字符,读入字符后,它先是在调用自已,如果n还是没有小于0,就继续读入字符,所以并没有输出,直到最后n小于0,函数便返回了,由于没有返回值,它其实就是回到调用者的下一个步骤,于是先是倒数第二个执行putchar(),然后是倒数第三个执行putchar()……直到第一个,所以先读入的字符后输出,后读入的字符先输出,便是反向输出!
你可以每次只输入一个字符试试,看看每一次函数调用如何执行。不过这样的话你就要把getchar()换成scanf()了,因为getchar()会读入回车键。