函数的递归调用

(一)函数的嵌套调用

问题: 输入四个整数,求最大的那个数,使用嵌套调用;

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;
}

在这里插入图片描述
重要的事情说三遍!!!
递归出口放在开始!
递归出口放在开始!
递归出口放在开始!

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值