递推与递归的描述
递归和递推要求”原问题“与”问题边界“之间每个变换步骤具有相似性。
递推
若已知某处边界、小范围或特殊条件下,从这个边界为起点想原问题推导的方式就是递推。
递归
大多数时候,无法确定递推路线。采用递归:
- 将问题规模缩小,划分为子问题。(自身调用自身)
- 如果求解失败,使产生的影响失效,回到原位置。(回溯时还原现场)
递推和递归的应用
在使用枚举算法暴力遍历整个问题的”状态空间“时,经常需要递归。
按照规模大小,有如下几种方式:
枚举形式 | 状态空间规模 | 一般遍历方式 |
---|---|---|
多项式 | n^k^,k为常数 | 循环(for)、递推 |
指数 | k^n^,k为常数 | 递归、位运算 |
排列 | n! | 递归、C++net_permutation |
组合 | $C_{n}^{m}$ | 递归+剪枝 |
分治
分治法把一个问题划分为若干个规模更小的同类子问题,对子问题递归求解,然后回溯时推导出原问题的解。