C++从零开始学(视频教学版)(第2版)
上QQ阅读APP看书,第一时间看更新

6.3 特殊函数调用方式——递归调用

在任何一个函数体内不能出现其他函数的定义。但是,在任何一个函数体内可以调用任何函数,包括该函数本身。

在一个函数中,如果出现直接或者间接地调用函数本身,就称为递归调用,相应的函数称为递归函数。

提示

在进行递归调用时,被调用函数的数据环境和调用函数的数据环境在结构上是一致的,只是被调用函数和调用函数传递的参数不同而已。

编写一个递归函数,首先找到递归公式,然后设置初始条件和出口。


(1)找递归公式(往往是找f(n)和f(n-1)之间的关系)。

(2)递归结束条件。


例如,n!=n*(n-1)!(递归公式)。

1!=1(终止条件)。

明确以上两个条件,就很容易写出代码。

下面通过一个实例来说明如何进行递归调用。

现有一个数列,已知an=2*a(n-1)+3,并且a1=1,求解a1~a8的各项值。把数列问题转化为函数问题,认为an=f(n),a(n-1)=f(n-1)……于是f(n)=2*f(n-1)+3,f(n-1)=2*f(n-1-1)+3……直到f(1)=1。


【实例6-8】递归(代码6-8.txt)

新建名为“dgtest”的【C++ Source File】源程序,源代码如下所示:

【代码详解】

在该例中,首先声明了一个函数f。在主函数中,使用for循环,循环调用f(i),将每个f都输出。定义函数f,如果参数n的值为1,就返回1,这个是递归调用的出口;如果参数值大于1,就调用递归函数2*f(n-1)+3。

运行结果如图6-9所示。

图6-9 代码运行结果

【实例分析】

从结果来看,将f(1)~f(8)的值全部都计算输出。