ad

《C++程序开发案例课堂》_了解C++的更好途径_6.3 特殊函数调用方式——递归调用

admin 65 2023-11-01

【摘要】 本书摘自《C++程序开发案例课堂》一书中第6章,第3节,由刘春茂、李琪编著。

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

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

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

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

《C++程序开发案例课堂》_了解C++的更好途径_6.3 特殊函数调用方式——递归调用

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

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

(2)递归结束条件。

如: n!=n*(n-1)!(递推公式)。

1!=1(终止条件)。

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

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

【例6-8】递归调用(代码6-8.txt)。

现有一个数列,已知an=2*a(n-1)+3, 并且a₁=1, 求解a₁ 到 ag的各项值。把数列问题转化 为函数问题,认为 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。

新建名为dgtest的 C++ Source File 源程序。源代码如下:

#include

using namespace std;

int f(int n);//看作数列

int main()

for (int i=1;i<=8;i++)

cout <<"f("<【代码剖析】

在该例中,首先声明了一个函数 f。在主函数

中,使用for循环调用 f(i), 将每个f 都输出;定义

函数f, 如果参数n 的值为1,则返回1,这个是递

归调用的出口;如果参数值大于1,则调用递归函

数2*f(n-1)+3。

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

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

6.4 内 联 函 数

函数的引入可以减少程序的目标代码,实现程序代码的共享。但是,函数调用也需要一 些时间和空间方面的开销,因为调用函数实际上将程序执行流程转移到被调函数中,被调函 数的程序代码执行完后,再返回到调用的地方。这种调用操作要求调用前保护现场并记忆执 行的地址,返回后恢复现场,并按原来保存的地址继续执行。对于较长的函数,这种开销可 以忽略不计,但是对于一些函数体代码很短但又被频繁地调用的函数,就不能忽视这种开 销。引入内联函数正是为了解决这个问题,提高程序的运行效率。

在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进 行替换。由于在编译时将函数体中的代码替代到程序中,因此会增加目标程序代码量,进而 增加空间开销,而在时间开销上不像函数调用时那么大,可见它是以目标代码的增加为代价 来换取时间的节省。

在内联函数内不允许用循环语句和开关语句。内联函数的定义必须出现在内联函 数第一次被调用之前。

下面通过一个实例来说明如何使用内联函数。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 [email protected] 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《C++程序开发案例课堂》_了解C++的更好途径_7.1.3 数组的操作
下一篇:《C++程序开发案例课堂》_了解C++的更好途径_2.1.3 变量声明和定义
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×