函数的嵌套调用
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. 递归调用的执行过程(递归的深入理解)
递归调用的执行过程分为递推过程和回归过程两部分。这两个过程由递归终止条件控制,即逐层递推,直至到达递归终止条件,然后逐层回归。递归调用与普通的函数调一样,利用了先进后出的栈结构来实现。每次调用时,在栈中分配内存单元,保存返回地址以及参数和局部变量;而与普通的函数调用不同的是,由于递推的过程是一个逐层调用的过程,因此存在一个逐层连续的参数入栈过程,调用过程每调用一次自身,把当前参数压栈,每次调用时都首先判断递归终止条件,直至达到递归终止条件为止;接着回归过程不断从栈中弹出当前的参数,直到栈空返回到初始调用处为止。