什么问题可以用递归?
当前问题可以进行拆分,拆分为子问题。子问题的本质和父问题是一样的,解决了子问题,父问题也就迎刃而解。同时子问题可以继续向下分解。
例如:数组排序问题
分解为数组左边部分排序和又边部分排序
找数组最大数问题
找数组左边最大数和数组右边最大数,然后返回最大的那一个
求 n 的阶乘
等价于求(n-1)的阶乘再乘以n n-1的阶乘等于n-2的阶乘再乘以n-1
递归行为
递归行为在程序执行时,相当于系统帮程序员进行压栈出栈的行为,在压栈的时候不仅会将要执行的函数、变量等压入栈中,同时还会记录当前执行到程序的哪一行。
递归的时间复杂度估算
master公式的使用
T(N) = a*T(N/b) + O(N^d)
- log(b,a) > d -> 复杂度为O(N^log(b,a))
- log(b,a) = d -> 复杂度为O(N^d * logN)
- log(b,a) < d -> 复杂度为O(N^d)
例如:找数组最大值
int Maxnum(vector<int>&obj,int left,int right){
if (left == right)
return obj[left];
int mid = (left + right) / 2;
int left_max = Maxnum(obj, left, mid);
int right_max = Maxnum(obj, mid+1, right);
return left_max > right_max ? left_max : right_max;
}
T(N) = 2*T(N/2)+O(N^0)
log(2,2)>0 复杂度为O(N^log(2,2) = O(N);
来源:CSDN
作者:和平精英总指挥
链接:https://blog.csdn.net/weixin_44997886/article/details/104754066