C语言的函数调用可以在main()函数中进行,也可以它本身调用自己,这种调用方式就是递归。先看段代码:
void up_and_down(int);
int main(void)
{
up_and_down(1);//被调函数
return 0;
}
void up_and_down(int n)
{
printf("Level %d: n 的地址 %p\n", n, &n); /* #1 */
if (n < 4)
up_and_down(n+1);//递归调用
printf("LEVEL %d: n 的地址 %p\n", n, &n); /* #2 */
}
/* 递归:送出去,返回来 */
所谓递归,顾名思义就是送出去(递),返回来(归),上面递归调用过程中:#1是完成“递”的过程,即从第一层执行到第四层,打印出:
printf("Level %d: n 的地址 %p\n", n, &n); /* #1 */
然后#2是完成了“归”的过程,即从第四层返回第一层,也就是说要返回到n=1的初始值,因为调用函数的初始值本来就是1。打印出:
printf("LEVEL %d: n 的地址 %p\n", n, &n); /* #2 */
在调用过程中n的值从1一直变到4,然后又从4变到1。总的来说就是位于递归调用前的语句顺序执行,位于递归调用函数之后的语句逆向执行递归调用之前的语句。至此,整个递归调用的过程就结束了。值得注意的是变量n其实是代表了四个不同的变量,其地址在发生着变化,这点从打印出来n的地址就可以看出。
递归调用的类似于循环的作用,它的好处是省去循环的麻烦,但可以实现循环的功能。
附打印结果如下: