文章目录
(一)函数的嵌套调用
问题: 输入四个整数,求最大的那个数,使用嵌套调用;
8, 4, 9, 1
#include<iostream>
using namespace std;
int max1(int x, int y)//求两个数中的最大数
{
if (x > y)
return x;
else
return y;
}
int max2(int a, int b, int c, int d)
{
int m;
m = max1(a, b);//此时的m是a和b中较大的那个;
m = max1(m, c);//此时的m是a,b,c中较大的那个;
m = max1(m ,d);//此时的m是a,b,c,d中最大的那个;
return m;
}
int main()
{
int a, b, c, d;
int max;
cin >> a >> b >> c >> d;
max=max2(a, b, c, d);
cout << max << endl;
return 0;
}
分析一下这个算法:
在main函数里调用max2函数求四个数的最大值,再在max2函数里反复调用max1函数,max1函数的作用就是找两个数中的较大者。
max2函数的执行过程是这样的:第一次调用max1函数得到的值是a和b中的大者,把它赋值给m;第二次调用max1函数得到m和c中的大者,也就是a,b,c中的最大者,把它赋值给m;第三次调用max1函数得到m和d的大者,也就是a,b,c,d四个数的最大值,把它赋值给m:此时,m的值就是四个数里的最大值;
这是一种递推的方法,先求两个数的大者,在此基础上再求三个数的大数,再以此为基础,求四个数的最大值;
max1函数也可以写为一个return语句:
int max1(int x, int y)
{
return x>= y? x : y;
}
max2函数也可以改进:
int max2(int a, int b, int c, int d)
{
return max1(max1(max1(a, b), c), d);
}
一般的,函数的嵌套调用就是在调用一个函数的过程中,调用另外一个函数;
如图:
(二)函数的递归调用
【定义】:在调用函数的过程中又直接或间接的调用该函数本身;
如图:
显然,这种递归调用是无休止的自身调用,然而算法程序中是不能出现这种情况的;所以,就要写一个递归出口,就是函数满足某一条件时,才执行递归;否则,就不执行;
看个例题:
有五个学生坐在一起,问第五个学生几岁,他说比第四个学生大两岁。问第四个学生几岁,他说比第三个学生大两岁。问第三个学生几岁,他说比第二个学生大两岁。问第二个学生几岁,他说比第一个学生大两岁。最后第一个学生他说他10岁,问这五个学生的年龄?
【思路】:要求第五个学生的年龄,就必须知道第四个学生的年龄,而要求第四个学生的年龄就必须知道第三个学生的年龄,而第三个学生的年龄又取决于第二个学生的年龄,第二个学生的年龄又取决于第一个学生的年龄。而且每个学生的年龄都比前一个大二。即:
age(5)=age(4)+2;
age(4)=age(3)+2;
age(3)=age(2)+2;
age(2)=age(1)+2;
age(1)=10;
写成数学公式如下:
age(n)=10; ------------------------------ (n=1)
age(n)=age(n-1)+2; ------------------------------ (n>1)
图解如下:
由图看到,求解过程分为两个阶段;第一个阶段是“回溯”,即age(n)=age(n-1)+2;直到回溯第一个学生的年龄,此时已知age(1)=10;然后就是第二个阶段“递推”,从第一个学生的年龄推出第二个学生的年龄为12岁,从第二个学生的年龄推出第三个学生的年龄为14…一直推出第五个学生的年龄(18岁)为止;
这里,这个递归不是无限制的执行下去,当age(1)=10时,递归结束;age(1)=10就是递归结束的出口;
代码如下:
#include<iostream>
using namespace std;
int getage(int n)
{
int c;
if (n == 1)//递推出口
return c=10;
else
return c=getage(n - 1) + 2;//递归循环条件;
}
int main()
{
int age;
int n;//要求的第n个学生的年龄;
while (cin >> n&&n)
{
age = getage(n);
cout <<"该学生的年龄为:"<< age << endl;
}
return 0;
}
说到这里,相信大家对递归有一定的了解了,那就做个题吧;
用递推求n!;
【思路】:5!=4!*5,而4!=3!*4,3!=2!*3,2!=1!*2,1!=1;
数学公式:
n!=1,(n=1);
n!=(n-1)*n;,(n>1);
【图解】:
代码如下:
#include<iostream>
using namespace std;
int fun(int n)
{
int c;
if (n == 1)
return c = 1;//递归出口;
else
return c = fun(n - 1)*n;
}
int main()
{
int n;
int num;
while (cin >> n&&n)//多次输入当输入等于0时结束输入;
{
num = fun(n);
cout << n;
cout << '!'<<'='<<num << endl;
}
return 0;
}
重要的事情说三遍!!!
递归出口放在开始!
递归出口放在开始!
递归出口放在开始!