【递归】递归求n个数中的最大值

              ❤️坚持是一种品质❤️

🧓作者:每天都要记得刷题(●’◡’●)
🍉时间:2022/04/04
🍉本篇感悟:举一反三,由求 n的阶乘联想到递归求n个数中的最大值,对递归有了更深的了解。

⭐题目(代码😇在文末)

使用递归求 55 ,22, 155, 77, 99这5个数中的最大值

⭐递归思想

在这里插入图片描述

🎈Q: 什么是递归?
A1:我们学过函数,知道了函数调用,函数调用就是一个函数调用其他函数,比如主函数调用求两个数之和。
A2:递归就是一个函数调用自身,例如主函数调用主函数(这就是最简单的函数递归,但是会造成死循环,不建议这末做)

#include<stdio.h>
int main()
{
	printf("我现在知道递归是什么了");
	main();
	return 0;
}

死循环了,代码如下:
在这里插入图片描述

🎈递归递归:有递有归,先递后归

以4的阶乘为例:
4!
递:4 递:3 递:2 递;1
归:1 归:2 归:6 归;24

🎈 利器1:递推公式(数学公式)

在这里插入图片描述

🎈利器2:递推栈图:

在这里插入图片描述

🎈利器三:把求解的任务重复(大问题化为类似的子问题)
递归出口:最后一次递归,此时的函数值是可以直接算出,不需要递归求得,递归出口往往是边界的时候
不断递归:每递归一次,下一次需要递归就会逐渐靠近这个递归出口
同时递归的开始的时候我们要把要递归的当成我们已知的,进行操作,如递归求n的阶乘为例,我们就假设n-1的递归值是已知的。

备注:递推必须要有递推出口

⭐求前n个斐波那契数

🎈具体代码:


#include<stdio.h>

int fabo(int n)
{
	if (n == 1 || n == 2)
	{
		return 1;
	}
	return fabo(n - 1) + fabo(n - 2);

}

int main()
{
	//递归求斐波那契数列的前50项的和
	int i = 0;
	for (i = 1; i <51;i++)
	{
		printf("%d\t", fabo(i));
	}
	return 0;
}

⭐具体代码(答案😇)

🎈递归出口:当数组只有一个元素
不断递归:那么我们就可以反向的推出:应该从数组下标大的一端开始递归,且把任务一步一步向递归出口逼近,同时调用自身。
🎈往里套用就是:
关键:重复把求最大值这个过程重复再重复,知道找到递归出口

1.当数组只有一个元素的时候,这个数就是最大值
2.但是当n>1时,从数组下标大的一端开始自身调用**,将最后一个数和n-1个数中的最大值进行比较(假设我们已知)**
3.然后就是求n-1个数中的最大值,也就是重复了以上的步骤
4.知道我们到了递归出口,再归回去就可以了。

#include<stdio.h>
int find_max(int* a, int n)
{
	
	if (n == 1)
	{
		return a[0];
	}
	
		return a[n - 1] > find_max(a, n - 1) ? a[n - 1] : find_max(a, n - 1);
	
	
}
int main()
{
	//递归求n个数中的最大值
	int a[5] = { 55,22,155,77,99 };
	int ret=find_max(a, sizeof(a) / sizeof(a[0]));
	printf("%d\n", ret);
	return 0;
}

运行结果:

👌最后,到这里就结束了,码字不易,耗时耗力,欢迎三联一波。🙌🙌🙌

              ❤️关注我一起成长 ❤️
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上心头

为爱发电

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值