找重复:
- 找到一种划分方法
- 找到递推公式或者等价转换 都是父问题转换为求解子问题,其中会有变化的量
- 子问题和父问题有一样的表现形式
.找变换的量
- 变化的量通常要作为参数
找参照
- 找到相对参照,有些题中参照物是不断变化的,因此传入的参数也要改变顺序
找出口
(所有的循环都可以改成递归,因为循环都是重复)
汉诺塔,将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从辅助空间回到源空间上去
}
}