理论教育 C语言程序设计教程:函数递归调用

C语言程序设计教程:函数递归调用

时间:2023-11-21 理论教育 版权反馈
【摘要】:例如,有函数fun ()定义如下:fun ()函数是一个递归函数,在它的函数内部又调用了自己。需要注意的是,递归调用必须要有结束条件,否则就会陷入无限递归的状态,永远无法结束调用。例7.5 用递归法计算n!图7-6函数递归调用的执行流程执行本程序时输入为5,即求5!进行4次递归调用后,fun ()函数形参的值变为1故不再继续递归调用,这个阶段称为回溯阶段。之后开始第二阶段,即递推阶段,逐层返回到主调函数。

C语言程序设计教程:函数递归调用

C语言允许函数进行递归调用,即一个函数可以直接或间接地调用自己。a()函数调用a()函数自己称为直接递归;a()函数调用b()函数,b()函数又调用a()函数称为间接递归。在递归调用中,主调函数又是被调函数。

例如,有函数fun ()定义如下:

fun ()函数是一个递归函数,在它的函数内部又调用了自己。需要注意的是,递归调用必须要有结束条件,否则就会陷入无限递归的状态,永远无法结束调用。

一个问题要采用递归方法来解决,须符合以下条件。

(1)可以把要解决的问题转化为一个新问题,新问题的解决与原问题的解决方法一样,只是所处理的对象有规律地递增或递减。可以应用这个转化过程使问题得到解决。

(2)必须有一个明确的结束递归的条件。

下面举例说明递归调用的执行过程。

例7.5 用递归法计算n!

解题思路:

求n!可以用以下数学关系表示。

n!=1 (n=0,1)

n!=n × (n-1) ! (n > 1)

可以看出求n!可转化为先求(n-1) ! ,而求(n-1)!又要转化为先求(n-2) ! ,……,依次类推,直到求1!时即表示递归结束。(www.daowen.com)

编写程序:

创建一个名为“eg7_5.c”的新文件,在编辑窗口中输入下面的程序代码。

运行结果:

程序说明:

(1)fun()函数是一个递归函数。主函数调用fun ()函数后,流程进入fun ()函数执行。如果n <0,n ==0或n==1时都将结束函数的执行,否则就递归调用fun ()函数自身。由于每次递归调用的实参为n-1,即把n-1的值赋予形参n,最后当n-1的值为1再作递归调用时,形参n的值就为1,将使递归终止,之后可逐层退回。可见,n ==0或n==1是fun( )函数结束递归的条件。

图7-6 函数递归调用的执行流程

(2)执行本程序时输入为5,即求5! ,程序执行流程如图7-6所示。执行主函数中的调用语句f=fun(5);,流程进入fun ()函数,由于n =5,不等于0或1,故应执行f=fun(n-1) * n;,即f=fun(4) * 5;。该语句对fun()函数作递归调用即调用fun (4)函数。进行4次递归调用后,fun ()函数形参的值变为1故不再继续递归调用,这个阶段称为回溯阶段。之后开始第二阶段,即递推阶段,逐层返回到主调函数。首先将fun(1)函数的值1,返回到调用fun (1)函数的地方,即fun(2)函数中。此时,就可计算fun (1) * 2,即1 *2=2,再将值2返回到调用fun(2)函数的地方,即fun(3)函数中。依次类推,最后将fun(5)的返回值120返回到main ()函数,执行输出语句,输出“5! = 120”。由此可见,一个递归的问题可以分为回溯和递推两个阶段。

(3)本例题中,当输入13想要计算13!时,却得不到预期的结果。请思考此问题的原因和解决的方法。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈