文件名称:函数的嵌套递归调用-复高斯分布的数学基础理论
文件大小:6.48MB
文件格式:PDF
更新时间:2024-06-28 07:07:11
嵌入式 Linux C
5.7 函数的嵌套、递归调用 5.7.1 函数的嵌套调用 C 语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下 一级函数的问题。但是 C 语言允许在一个函数的定义中出现对另一个函数的调用。这样就出 现了函数的嵌套调用,即在被调函数中又调用其他函数,它们的关系如图 5.13 所示。 C 语言提倡将大问题划分成一个个子问题来进行解决,因此在 C 语言中,函数的嵌套是非常普 遍的。 由于在 C 语言中,函数的调用都是通过堆栈来实现的,在函数 1 调用函数 2 之间,系统 会把自己的局部变量、函数地址、参数列表等都压入堆栈,在子函数调用结束后,系统又会 把调用函数的局部变量、函数地址、参数列表等都从堆栈中弹出;如图 5.14 所示。 返回 调用 返回 调用 函数 1 函数 2 函数 3 当前帧 调用者的帧 较早的帧 参数 n 参数 1 返回地址 被保存的寄存器、临 时变量等 参数构造区域 栈底 栈顶 错误! 图 5.13 函数嵌套调用关系图 图 5.14 函数嵌套调用中的系统布局 各个栈在调用时都有它们的私有空间,多个未完成的部分变量不会相互影响。因此,若 被调函数含有与调用函数相同名称的局部变量,它们彼此之间不会受到影响。 5.7.2 函数的递归调用 1.递归调用实例 函数的递归调用实际上可以看作是一种特殊的函数嵌套使用,它的特殊性就在于该函数 所嵌套的函数就是它本身。因此,主调函数又是被调函数。执行递归函数将反复调用其自身, 每调用一次就进入新的一层。 在很多教科书中都使用计算阶乘来说明递归,事实上,在这个例子中,递归并没有提供 任何优越之处。其实,函数递归调用的特征不仅在于它类似于 while 的循环调用,还在于它 能够以堆栈(先进后出)的方式来工作。 这里有一个简单的例子用于说明递归,程序的目的就是把一个整数从二进制的形式转换