有A、B、C三根柱子,第一个有64个盘子,从上往下盘子越来越大。现要把64个盘子全部移到第3个柱子上,移到的时候始终只能小盘子压着大盘子,而且每次只能移到一个。
分析:
假设第一根只有3个盘,从上往下分别为 a、b、c,那么移动这3个盘到第三根柱子的流程如下:
- 把 a 从第一根柱子移动到第三根柱子,即 A -> C
- 把 b 从第一根柱子移动到第二根柱子,即 A -> B
- 把 a 从第三根柱子移动到第二根柱子,即 C -> B
- 把 c 从第一根柱子移动到第三根柱子,即 A -> C
- 把 a 从第二根柱子移动到第一根柱子,即 B -> A
- 把 b 从第二根柱子移动到第三根柱子,即 B -> C
- 把 a 从第一根柱子移动到第三根柱子,即 A -> C
总的来说,
- 把 A 柱上的 a、b 两个盘借助 C 柱移动到 B 柱
- 把 A 柱上的 c 盘移动到 C 柱
- 把 B 柱上的 a、b 两个盘借助 A 柱移动到 C 柱
因此我们推算出,把 n 个盘子从 A 柱移到 C 柱:
- 把 A 柱上的 (n-1)个盘借助 C 柱移动到 B 柱
- 把 A 柱上的第 n 个 盘移动到 C 柱
- 把 B 柱上的(n-1)个盘借助 A 柱移动到 C 柱
用递归算法实现如下:
function move(n, A, B, C) {
if(n === 1) {
// 只有一个盘时,直接从 A 柱上移动到 C 柱
console.log(A + "--->" + C);
} else {
// 把(n-1)个盘从 A 柱上的借助 C 柱移动到 B 柱
move(n-1, A, C, B);
// 把第 n 个盘从 A 柱上移动到 C 柱
console.log(A + "--->" + C);
// 把(n-1)个盘从 B 柱上的借助 A 柱移动到 C 柱
move(n-1, B, A, C);
}
}
var n = 3;
move(n, "A", "B", "C");