C++函数二(函数的嵌套调用和递归调用)
函数的嵌套调用
C++不允许对函数作嵌套定义,也就是说在一个函数中不能完整地包含另一个函数。在一个程序中每一个函数的定义都是互相平行和独立的。虽然C++不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数
所谓嵌套调用,是在调用一个函数并执行该函数的过程中,又调用另一个函数的情况。如在main()函数中调用了a函数,而在a函数的执行过程中又调用b函数。这就构成了两层嵌套调用,如图所示:
根据函数的调用原则,被调用函数返回时(执行了return语句,或执行到函数的最后语句),一定是返回到调用它的函数(主调函数)的中断位置,继续执行主调函数后面的语句。
【实例】
#include<iostream> using namespace std; int func2(int x) { int t; t = x + 9; return (t); } int func1(int a, int b) { int z; z = func2(a*b); return(z); } int main() { int x1 = 2, x2 = 5, y; y = func1(x1, x2); cout << y << endl; system("pause"); return 0; }
函数的递归调用
1.递归调用
函数的递归调用:在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用
double f(double x) double y; y=f(x); return y*y;
这里,在f函数的内部,又调用了f函数,这是直接调用本函数。如果在调用f1函数过程中要调用f2函数,而在调用f2函数过程中又要调用f1函数,这是间接调用本函数。
递归调用都是无终止地调用自己。程序中不应该出现这种无止的递归调用,而应该为有限次数、有终止的递归调用。这可以使用if语句来控制,当满某一条件时让递归调用结束。
【实例】从键盘输入一个整数,求该数的阶乘。
根据求一个数n的阶乘的定义n!=n(n-1),可写成如下形式:
f(n)=1 (n=1)
Fac(n)=n*fac(n-1) (n>1)
#include<iostream> using namespace std; long fac(int n) { long p; if (n == 1) p = 1; else p = n * fac(n - 1); return p; } int main (){ int n; cout << "输入一个正整数"; cin >> n; cout << n << "!=" << fac(n)<< endl; system("pause"); return 0; }
2. 递归调用的执行过程(递归的深入理解)
递归调用的执行过程分为递推过程和回归过程两部分。这两个过程由递归终止条件控制,即逐层递推,直至到达递归终止条件,然后逐层回归。递归调用与普通的函数调一样,利用了先进后出的栈结构来实现。每次调用时,在栈中分配内存单元,保存返回地址以及参数和局部变量;而与普通的函数调用不同的是,由于递推的过程是一个逐层调用的过程,因此存在一个逐层连续的参数入栈过程,调用过程每调用一次自身,把当前参数压栈,每次调用时都首先判断递归终止条件,直至达到递归终止条件为止;接着回归过程不断从栈中弹出当前的参数,直到栈空返回到初始调用处为止。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步