二 递归与分治
1.递归
1.1 定义
递归函数:用函数自身定义的函数
递归函数的两个要素:边界条件与递归方程
递归算法:直接或间接调用自身的算法
1.2 双递归函数
当一个函数及它的一个变量是由函数自身定义时,则称这个函数为双递归函数;
例如:
Ackerman函数,其定义如下:
A(1,0)=2
A(0,m)=1 m≥0
A(n,0)=n+2 n ≥2
A(n,m)=A(A(n-1,m),m-1) n,m ≥1
1.3 典型递归问题
1.4 递归的优缺点
优点:
1)算法简明;
2)正确性易证明,是分析、设计的有力工具。
缺点:
1)执行效率不高;
2)堆栈空间耗费
2 分治法
2.1设计思想
设计思想是,将规模为n的问题分解为k个规模较小的子问题,使这些子问题相互独立且与原问题相同,递归地解这些子问题,然后各个子问题的解合并得到原问题的解
[注意]:在用分治法设计算法时,最好使子问题的规模大致相同。 即将一个问题分成大小相等的k个子问题
2.2 能用分治法解决的问题的特征
分治法所能解决的问题一般具有以下特征:
- 该问题可以分解为若干个规模较少的相同问题
- 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题
- 该问题的规模缩少到一定规模就可以容易地解决,问题规模不能无休止地缩小下去
4.利用该问题分解地子问题的解可以合并为该问题的解
2.3 分治法的求解过程
分治法的求解过程:
- 分解:把原问题分解为若干个规模较小、相互独立,与原问题相同的子问题;
- 求解:若子问题规模较小且容易被解决则直接解,否则再继续分解为更小的子问题,直到容易解决;
- 合并:将已求解的各个子问题的解,逐步合并为原问题的解
2.4算法时间复杂性
2.5 适用问题
大数相乘、矩阵乘法、快速富立叶变换、
棋盘覆盖、排序、选择等。