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. 递归调用的执行过程(递归的深入理解)

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

原文地址:https://www.cnblogs.com/CX66/p/13907505.html