C++语言基础|函数的嵌套与递归
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!的最大的n
int n;
cout<<"Input a integer number:";
cin>>n;
if (n>=1&&n<=max_n)
cout<<"Factorial of "<<n<<" is: "<<fac(n)<<endl;//递归函数调用
else
cout<<"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版 ↩︎