0x02
递推与递归
递推与递归是程序遍历状态空间的两种基本方式。
1.递推与递归的宏观描述
以已知的“问题边界”为起点向“原问题”正向推导的扩展方式就是递推。
然而在很多时候,推导的路线难以确定,这时以“原问题”为起点尝试寻找把状态空间缩小到已知的“问题边界”的路线,再通过该路线反向回溯的遍历方式就是递归。
2.递推与递归的简单应用
在使用枚举算法来蛮力搜索问题的整个状态空间时,经常需要使用递归。按照问题规模的大小,有如下几种常见的枚举形式和遍历方式:
枚举形式 | 状态空间规模 | 一般遍历方式 |
---|---|---|
多项式 | n k , k 为 n^k,k为 nk,k为常数 | 循环(for)、递推 |
指数 | k n , k 为 k^n,k为 kn,k为常数 | 递归、位运算 |
排列 | n ! n! n! | 递归、C++ next_permutation |
组合 | C n m C^m_n Cnm | 递归+剪枝 |
3.分治
分治法把一个问题划分成若干个规模更小的同类子问题,对这些子问题递归求解,然后在回溯时通过它们推导出原问题的解。