C++语言基础|函数的嵌套与递归
- 1. 函数的嵌套调用
- 2. 函数的递归调用
1. 函数的嵌套调用
在一个函数中调用其它函数叫函数的嵌套。C++中函数的定义是平行的,除了main()以外,都可以互相调用。函数不可以嵌套定义,但可以嵌套调用。比如函数1调用了函数2,函数2再调用函数3,这便形成了函数的嵌套调用。 1
/***************************************************************
* 函数的嵌套调用, 求三个数中最大数和最小数的差值 *
**************************************************************/
#include<iostream>
using namespace std;
int max(int x,int y,int z) //函数定义
{ int t;t=x>y?x:y;return(t>z?t:z);
}
int min(int x,int y,int z)
{int t;t=x<y?x:y;return(t<z?t:z);
}
int dif(int x,int y,int z)
{ return max(x,y,z)-min(x,y,z); //嵌套调用
}
int main()
{ int a,b,c;cin>>a>>b>>c;cout<<"Max-Min="<<dif(a,b,c)<<endl;return 0;
}
注意:
- C++中函数的定义是平行的,除了main()以外,都可以互相调用。
- 函数不可以嵌套定义,但可以嵌套调用。
2. 函数的递归调用
在调用一个函数的过程中又直接或间接地调用该函数本身的现象,叫做函数的递归调用。
n ! = { 1 n=0 n ∗ ( n − 1 ) ! n>0 n!= \begin{cases} 1& \text{n=0}\\ n*(n-1)!& \text{n>0} \end{cases} n!={1n∗(n−1)!n=0n>0
递归可以分为直接递归调用和间接递归调用。
- 直接递归调用:是在调用函数的过程中又调用该函数本身;
- 间接递归调用:是在调用 f 1 ( ) f_1() f1()函数的过程中调用 f 2 ( ) f_2() f2()函数,而 f 2 ( ) f_2() f2()中又需要调用 f 1 ( ) f_1() f1()。
递归方法是从结果出发,归纳出后一结果与前一结果直到初值为止存在的关系,要求通过分析得到:初值+递归函数,然后设计一个函数(递归函数),这个函数不断使用下一级值调用自身,直到结果已知处。
递归函数设计的一般形式是:
函数类型 递归函数名f (参数x ){if(满足结束条件)结果=初值;else结果=含f(x-1)的表达式;返回结果;}
/************************************************
* 函数的递归调用, 求n! *
************************************************/
#include<iostream>
using namespace std;
int fac(int n)
{int t;if(n==1) t=1;else t=n*fac(n-1);//递归函数定义return (t);
}
int main()
{ const int max_n=12; // int 类型数能表示的n!的最大的nint n;cout<<"Input a integer number:";cin>>n;if (n>=1&&n<=max_n)cout<<"Factorial of "<<n<<" is: "<<fac(n)<<endl;//递归函数调用elsecout<<"Invalid n."<<endl;return 0;
}
递归程序分两个阶段执行:
- 调用: 欲求 f a c ( n ) fac(n) fac(n)→先求 f a c ( n − 1 ) → f a c ( n − 2 ) → … → f a c ( 1 ) fac(n-1)→fac(n-2) → … → fac(1) fac(n−1)→fac(n−2)→…→fac(1),若 f a c ( 1 ) fac(1) fac(1)已知,回推结束。
- 回代: 知道 f a c ( 1 ) fac(1) fac(1)→可求出$fac(2)→fac(3)→ … → (n) $
函数参数传递过程 :
本教程仅供教学使用,参考教材 :《C++语言程序设计教程》,杨进才、沈显君编著,清华大学出版社,2022年1月第4版 ↩︎