别用脑袋去想如何一步一步移动,因为人脑内存比较小,而且不适合栈操作,压着压着就忘了。特别是对于这种头递归,要记递归完了之后该继续哪些操作。
只要记得要将n个盘从A移到C的方法是:
1)如果n==1(只有1个盘),直接将其从A移到C即可,否则
2)将n-1个盘从A移借助C到B
3)将第n个盘从A移到C
4)再将n-1个盘从B移借助A到C
移动多个盘时都需要借助第三方柱子,并且跟原始问题只有规模不同,调用自身。
那么再问,将n个盘从A移到C要移动多少次呢?
设移动n个盘需要f(n)次,则有: f(n) = f(n-1) + 1 + f(n-1) = 2f(n-1) + 1, n>=2,f(1) = 1
这是一个通项公式,
可得, f(n) +1 = 2(f(n-1) + 1)
则,[f(n) +1]/[f(n-1) + 1] = 2
f(n) + 1是一个等比数列
f(n) = 2^n - 1
代码:
public class Hanoi {
public static void main(String[] args) {
Hanoi h = new Hanoi();
h.solve(3, "a柱", "b柱", "c柱");
}
public void solve(int n, String src, String transfer, String dst) {
if(n == 1) {
move(n, src, dst);
} else {
solve(n-1, src, dst, transfer);
move(n, src, dst);
solve(n-1, transfer, src, dst);
}
}
public void move(int n, String src, String dst) {
System.out.println(n + " " + src + " -----> " + dst);
}
}
输出:
1 a柱 -----> c柱
2 a柱 -----> b柱
1 c柱 -----> b柱
3 a柱 -----> c柱
1 b柱 -----> a柱
2 b柱 -----> c柱
1 a柱 -----> c柱