一个函数直接或间接地调用自己,称为函数递归调用。实现递归调用的函数称为递归函数。下面介绍递归程序的特点,递归调用过程的两个阶段以及设计递归程序的两个步骤。
1.递归程序的特点
一个问题可以转化为新问题,新问题与原问题具有相同的解法。问题的转化有明显的规律,本质上是一种循环。同时,递归要有明确的终止条件。否则会出现无休止的递归。
例如有函数如下:
这个函数时一个递归函数。但是运行该函数将无休止地调用其自身,这当然是不正确的。为了防止递归调用无休止的进行。常用的办法是加条件判断,满足某种条件后就不再作递归调用,然后逐层返回。下面举例说明函数递归调用的执行过程。
例5-10 用递归方法编写程序,计算n!。
n的阶乘算法表示的公式为
参考程序:
程序中给出的函数ff是一个递归函数。主函数调用ff后即进入函数ff执行,如果n<0,n==0或n==1,都将结束函数的执行,否则就递归调用函数ff自身。由于每次调用的实参为n-1,即把n-1的值赋给形参n,最后当n-1的值为1时再作递归调用,形参n的值也为1,将使递归终止。然后可逐层退回。
下面我们再举例说明以上程序执行时函数ff递归调用的过程。
假设程序执行时输入整数4,即求4!。在主函数中的调用语句为y=ff(4),进入ff函数后,由于n=4,不等于0或1,故应执行f=ff(n-1)*n,即f=ff(4-1)*4。该语句对ff作递归调用,即ff(3)。逐次递归展开如图5-11进行3次递归调用后,函数ff形参取得的值变为1,故不再继续递归调用,而开始逐层返回主调函数。ff(1)的函数返回值为1,ff(2)的返回值为1*2=2,ff(3)的返回值为2*3=6,最后ff(4)的返回值为6*4=24。
(www.xing528.com)
图5-11 递归调用示意图
程序运行时,从键盘给变量n赋值4的运行结果如图5-12所示。
图5-12 程序运行结果
2.递归调用过程的两个阶段
(1)回推阶段。
将问题一步一步转化成另一个问题,直到递归结束条件成立时为止。
(2)递推阶段。
从递归结束条件开始,一步一步推算结果,直到原问题出现时为止。
3.设计递归程序的两个步骤
(1)确定递归终止的条件。
(2)确定将一个问题转化为另一个问题的规律。
在执行递归程序的过程中,每次都调用递归函数自身。此时,形参变量名相同,与形参对应的实参值不同。调用完成后,函数返回值被压入“堆栈”保存。因此,在不同的调用中,返回值是不会相互混淆的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。