递归
Recursion
递归算法:直接或间接地调用自身的算法称为递归算法。
递归函数:用函数自身给出定义的函数成为递归函数。
分治策略
Divide and Conquer
设计思想:将一个难以直接解决的大问题分割成一些规模较小的相同问题,以便逐个击破。
由分治法产生的子问题往往是原问题的较小模式,这为使用递归技术提供了方便,我们可以通过反复应用分治,从而使得问题的规模不断缩小,直到使得子问题变得容易求解。
- 并非一切递归函数都能够用非递归方式定义。
- 当一个函数及它的一个变量由函数自身定义时,称这个函数为双递归函数。——Ackerman函数
分治策略设计算法的要点
- 子问题与原问题具有相同的性质
- 子问题的求解彼此独立
- 划分时子问题的规模应尽可能均衡(可获得更低的复杂度)
分治策略分解的子问题可通过递归/迭代方法进行求解
对于方程(1),可以使用迭代法、递归树(换名法,用2k来替换n)方法求解
对于方程(2),可以使用迭代法、换元法、递归树、主定理等方法求解
换名法求解方程(2)
分治策略是一种设计思想,而递归或迭代是一种求解的手段,二者不可混为一谈
分治策略的算法设计模式如下
divide-and-conquer(P){
if(|P| <= n0){ //n0是问题规模阈值,表示此处问题规模小到能够直接求解
adhoc(P); //adhoc()是分治法的基本子算法
}
divide P into smaller subinstances P1,P2,P3...Pk;
for(int i = 1; i <= k; i++){
yi = divide-and-conquer(Pi);
}
return merge(y1,y2,y3...yk); //merge()是分治法的合并子算法
}