找重复:
- 找到一种划分方法
- 找到递推公式或者等价转换 都是父问题转换为求解子问题,其中会有变化的量
- 子问题和父问题有一样的表现形式
找变换的量
- 变化的量通常要作为参数
找参照
- 找到相对参照,有些题中参照物是不断变化的,因此传入的参数也要改变顺序
找出口
(所有的循环都可以改成递归,因为循环都是重复)
汉诺塔,将1-N从A移动到B,c可以作为中转:
- 1~N-1移动到c,b为辅助
- 把N移动到B
- 把1~N-1 从c移动到B,A为辅助
/** * 汉诺塔递归解法 */ public class 汉诺塔游戏 { public static void main(String[] args) { printHanoiTower(3, "A", "B", "C"); } /** * 将N个盘子的路径的打印 * * @param N 初始的N个从小到达的盘子,N是最大编号 * @param from 原始柱子 * @param to 辅助的柱子 * @param help 目标柱子 */ static void printHanoiTower(int N, String from, String to, String help) { if (N == 1) { System.out.println("move " + N + " from " + from + " to " + to); return; } printHanoiTower(N - 1, from, help, to); // 先把前N-1个盘子挪到辅助空间上去 System.out.println("move " + N + " from " + from + " to " + to); // N可以顺利到达target printHanoiTower(N - 1, help, to, from); // 让N-1从辅助空间回到源空间上去 } }