先简单叙述一下递归
首先递归需要有两个条件: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;
}
我个人觉得这个图很好理解这个程序的执行过程
相当于二叉树的后序遍历