一、递归概念
直接或间接地调用自身的算法称为递归算法;用函数自身给出定义的函数称为递归函数。
二、递归过程
1.分治法产生的子问题是原问题的较小模式; |
2.反复应用分治手段,可以使子问题规模不断缩小; |
3.最终使子问题缩小到很容易被直接求出其解; |
4.将规模较小问题的答案逐级向上合并,可得大问题答案; |
三、递归算法模板
Type FuncName(参数){
if(满足边界条件){
边界条件的处理;
}
else{
非边界条件的处理;
1.分:问题划分为子问题
2.治:对各个子问题递归调用去解决
3.合:合并子问题的解为问题的解
}
}
四、递归算法的时间复杂性分析
1.递推方法求递归算法的时间复杂性
递推方法就是使用已有的信息,将问题一点点推出最终的结果,然后通过递推过程计算出算法的时间复杂性。
例子:阶乘(Factorial)
int Factorial(int n){
if(n == 1){
return 1; //边界条件的处理
}
else{
return n*Factorial(n - 1); //非边界条件的处理
}
}
2.Master定理方法求递归算法的时间复杂性
(1)首先根据 :
(2)比较和的阶的关系(>,=,<),求
规则1:如果:, 为常数,则
规则2:如果:,则
规则3:如果:, 为常数,且存在,当时,成立,为常数,则
注:这里要,为整数,是正函数
例子1:棋盘覆盖
根据Master定理规则1:
例子2:归并排序
根据Master定理规则2:
例子3
且关系成立,
根据Master定理规则3:
例子4
按照Master定理规则3,但找不到一个常数,使得
因此改题目不适用Master定理
3.递归树方法求递归算法的时间复杂性
1.递归树是迭代计算模型; |
2.递归树的生成过程与迭代过程一致; |
3.根据递归定义不断扩展递归树,直到边界条件(其值已知); |
4.对递归树产生的所有项求和就是递归方程的解; |
例子1
因为递归树有层,并且每层合计都为
故:
例子2
因为递归树有层,每层是按照
因此形成了等比数列公式: 前n项和,因此计算时应该计算,则 。
由:,
故: