C函数的递归调用
操作方法
- 01
递归的基本原理。 为了详细说明递归的使用方法,我们先来看一个例子。
- 02
程序中main()函数调用up_and_down()函数,可以称为第1级递归,然后up_and_down()函数调用其本身,称为第2级递归,第2级递归调用第3级递归,依此类推。为了深入程序的调用过程,在打印语句中显示了变量n的值及其内存地址&n,printf()函数使用%p格式显示变量的地址。
- 03
递归的具体工作过程。 首先main()函数使用参数1调用函数up_and_down(),因此up_and_down()中形式参量的值为1,故打印语句#1输出level 1。由于n的值小于4,所以在up_and_down()中(这是第1级递归)使用参数n+1即数值2调用了up_and_down()(这是第2级递归)。在第2级调用中n的值被赋为2,因此打印语句#1输出的是level 2。与此类似,下面两次调用语句#1分别打印level 3和level 4。 当开始执行第四级调用时,n的值是4,因此,if语句的条件不满足,这时不再调用up_and_down()函数,接着执行打印语句#2,即输出LEVEL 4。下面函数执行return语句,此时第4级递归调用结束,把控制返还给该函数的调用函数,也就是第3级调用函数。第3级调用中前一个执行过的语句是if语句中的第4次调用,因此它继续执行其后续的代码,执行打印语句#2,输出LEVEL 3。当第3级调用结束后,第2级调用函数继续执行后续代码,输出LEVEL 2,依此类推。 需要注意的是,每一次递归调用函数都产生其局部变量,可以通过察看变量的地址知道。由于系统不同可能得到的地址值不同,但是同一级递归中,函数调用时的变量地址和最后函数返回时的变量地址是一样的。
- 04
递归的基本要点。 第一,每一级的函数调用都有自己的变量。例子中第1级调用的n不同于第2级调用的n,因此程序创建了4个独立的局部变量,名字都是n,但分别具有不同的值,每一个变量的有效范围只是它所在的那个函数,这次调用结束后变量也被清除,这一点与普通的函数调用是一样的。
- 05
第二,每一次函数调用都会有一次返回。当程序流程执行到某一级递归的结尾处时,就会返回到其前一级继续执行。程序不能直接返回到main()函数中的初始调用处,而是通过递归的每一级逐步返回。
- 06
第三,递归函数中,位于递归调用语句之前的语句与各级递归中的被调用函数具有相同的执行次序。例如,在前面的例子中,打印语句#1位于递归调用语句之前,它按递归调用的次序被执行了4次,分别是第1级,第2级,第3级,第4级。
- 07
第四,递归函数中必须包含可以终止递归调用的语句。通常情况下,递归函数可以使用一个if语句或其他类似语句以便当函数参数达到某个特定值时结束递归调用。例如前面例子中,up_and_down(n)函数以n+1为实际参数调用调用其本身,当实际参数的值达到4时,条件语句if(n<4)得不到满足而结束递归。