递归
C允许一个函数调用其本身。这种调用过程被称作递归(recursion)。递归有时很难处理,而有时却很 方便实用。当一个函数调用自己时,如果编程中没有设定可以终止递归的条件检测,它会无限制地进行递 归调用,所以需要进行谨慎处理。
递归一般可以代替循环语句使用。有些情况下使用循环语句比较好,而有些时候使用递归更有效。递 归方法虽然使程序结构优美,但其执行效率却没有循环语句髙。
/* recur.c —递归举例 P236*/
#include <stdio.h>
void un_and_down(int);
int main(void)
{
un_and_down(1);
return 0;
}
void un_and_down(int n)
{
printf("Level %d: n location %p\n", n,&n);
if (n<4)
{
un_and_down(n+1);
}
printf("Level %d: n location %p\n", n,&n);
}
当开始执行第4级调用时,n的值是4,因此if语句的条件不满足。这时不再继续调用up_and_down () 函数。第4级调用接着执行打印语句#2,即输出LEVEL 4,因为’n的值是现在函数需要执行return语 句,此时第4级调用结束,把控制返回给该函数的调用函数,也就是第3级调用函数。第3级调用函数中 前一个执行过的语句是在if语句中进行第4级调用。因此,它开始继续执行其后续的代码,即执行打印语 句#2,这将会输出LEVEL 3。当第3级调用结束后,第2级调用函数开始继续执行,即输出了 LEVEL 2。 依此类推。
注意,每一级的递归都使用它自己私有的变量n。你可以通过查看地址的值来得出这个结论(当然, 不同的系统通常会以不同的格式显示不同的地址。关键点在于,调用时的Levell地址和返回时的Levell 地址是相同的)。