C++ 递归求解数组中L~R范围内的最大值

文章通过递归计算阶乘的例子,解释了递归的基线条件和递归条件。接着讨论了使用递归和分治策略找到数组中指定范围内最大值的问题,虽然不是最优解,但有助于理解这两种算法思想。最后,将递归过程类比为二叉树的后序遍历,帮助读者更好地掌握递归执行的顺序。
摘要由CSDN通过智能技术生成

先简单叙述一下递归
首先递归需要有两个条件:1.基线条件(终止条件) 2.递归条件
我们先从求解n的阶乘说起

int recursion(int n)
{
	if(n == 1)
	{
		return 1;//基线条件
	}
	else
	{
		return n * recursion(n - 1);//递归条件
	}
}

我们来理一下递归思路请添加图片描述
第一遍执行程序:
n = 3,return 3 * recursion(2),对应上图入栈序号①
第二遍执行程序:
n = 2,return 2 * recursion(1),对应上图入栈序号②
第三遍执行程序:
n = 1,return 1,对应上图入栈序号③
在第三遍执行程序的时候,满足终止条件,return 1,开始出栈,对应上图出栈序号

此时返回的结果就为 return 3 * 2 * 1;


开始求解数组中L~R范围内的最大值
采用的思路是递归+分治
这种思路不是解决此题的最优方法,但是是理解递归和分治思想的好例子
我们把数组分成两半,递归去找左边和右边的最大值,最后比较得出范围内的最大值

int recursion_find_max(vector<int>& nums, int L, int R)
{
	//基线条件
	if (L == R)
	{
		return nums[L];
	}
	// (L+R)>>1 更优的写法  防止数组长度过长 L+R会超出int范围
	int mid = L + ((R - L) >> 1);

	//递归条件
	int leftMax = recursion_find_max(nums, L, mid);
	int rightMax = recursion_find_max(nums, mid + 1, R);

	return leftMax > rightMax ? leftMax : rightMax;
}

请添加图片描述
我个人觉得这个图很好理解这个程序的执行过程
相当于二叉树的后序遍历

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值