9.3 递归
C允许函数调用它自己,这种调用过程称为递归(recursion)。递归有时难以捉摸,有时却很方便实用。结束递归是使用递归的难点,
因为如果递归代码中没有终止递归的条件测试部分,一个调用自己的函数会无限递归。
可以使用循环的地方都可以使用递归。有时用循环解决问题比较好,但有时用递归更好。递归方法更简洁,但效率却没有循环高。
9.3.1 演示递归
main()函数调用up_and_down()函数,这次调用称为“第1级递归”。然后up_and_down()调用自己,这次调用称为“第2级递归”。接着
第2级递归调用第3级递归,一次类推。
%p转换说明打印地址,如果你的系统不支持这种该是,请使用%u或%lu代替%p)。
/* recur.c -- recursion illustration */
#include <stdio.h>
void up_and_down(int);
int main(void)
{
up_and_down(1);
return 0;
}
void up_and_down(int n)
{
printf("Level %d: n location %p\n", n, &n); // 1
if (n < 4)
up_and_down(n+1);
printf("LEVEL %d: n location %p\n", n, &n); // 2
}
/* 输出:
*/
注意,每级递归的变量n都属于本级递归私有。这从程序输出的地址值可以看出(当然,不同的系统表示的地址格式不同,这里关键要注意,Level 1和LEVEL 1的地址相同,Level 2和LEVEL 2的地址相同,等等)。
如果觉得不好理解,可以假设有一条函数调用链---fun1()调用fun2()、fun2()调用fun3()、fun3()调用fun4()。当fun4()调用结束后,控制传回fun3();当fun3()调用结束后,控制传回fun2();当fun2()调用结束后,控制传回fun1();递归的情况与此类似,只不过fun1()、fun2()、fun3()、fun4()都是相同的函数。