- 编程实现把A的n个盘子移动到C(盘子编号是[1, n])
- 每次只能移动1个盘子
- 大盘子只能放在小盘子下面
1个盘子
2个盘子
3个盘子
汉若塔 - 思路
- 其实分2中情况讨论即可
- 当 n == 1时,直接将盘子从A移动到C
- 当 n > 1时,可以拆分成3大步骤
- 将 n - 1个盘子从A移动到B
- 将编号为n的盘子从A移动到C
- 将 n - 1个盘子从B移动到C
步骤1、3明显是个递归调用
汉若塔 - 实现
// 将第i个盘子从 from 移动到 to
void move(int i, String from, String to) {
System.out.printIn(i + "号盘子:" + from + "->" + to);
}
// 将n个盘子从 p1 移动到 p3
void hanoi(int n, String p1, String p2, String p3) {
if (n <= 1) {
move(n, p1, p3);
return;
}
hanoi(n - 1, p1, p3, p2);
move(n, p1, p3);
hanoi(n - 1, p2, p1, p3);
}
- T(n) = 2 * T(n - 1) + O(1)
因时间复杂度是:O(2^n) - 空间复杂度:O(n)