您的位置:首页 > 其它

汉诺塔解题思路

2020-07-02 21:52 22 查看

解题思路

汉诺塔塔问题符合数学统计归纳,千万别试图去理解n层移动问题(或者说去理解n层递归,人脑真不够用),理解3层汉诺塔问题就行。
总结起来如下:
递归的理解的要点主要在于放弃!放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件。

解题算法

  1. 如果A柱子只剩一个盘子,那么直接移动到C柱子即可
  2. 把 n-1 号盘子移动到缓冲区
  3. 把1号从起点移到终点
  4. 然后把缓冲区的n-1号盘子也移到终点

解题框架

/*
1.要从a到b 那c就是缓冲 move(n-1,from,to,buffer)
2.要从a到c 那b就是缓冲 move(1,from,buffer,to)
3.要从b到c 那a就是缓冲 move(n-1,buffer,from,to)
*/
//汉诺塔移动框架
void move(n,from,buffer,to){
if (n == 1) {
removeTo(from,to);
return;
}
move(n-1,from,to,buffer);
move(1,from,buffer,to);
move(n-1,buffer,from,to);
}
void removeTo(List<Integer> from, List<Integer> to) {
to.add(from.remove(from.size() - 1));
}

Java代码

//汉诺塔问题解释https://www.zhihu.com/question/24385418
public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {
remove(A.size(),A,B,C);
}
private void remove(int n, List<Integer> from, List<Integer> buffer, List<Integer> to) {
//如果A柱子只剩一个盘子,那么直接移动到C柱子即可
if (n == 1) {
removeTo(from,to);
return;
}
//1.把 n-1 号盘子移动到缓冲区
//把A柱子上面的n-1个盘子,借助辅助柱子C,放到柱子B上
remove(n - 1, from, to, buffer);
//2.把1号从起点移到终点
//此时A柱子剩下那个盘子是n个盘子中最大的那个,把他移动到C柱子上
remove(1, from,buffer,to);
//3.然后把缓冲区的n-1号盘子也移到终点
//最后把刚才放在B柱子上的n-1个盘子,借助柱子A辅助,放到柱子C上
remove(n - 1, buffer, from, to);
}

private void removeTo(List<Integer> from, List<Integer> to) {
to.add(from.remove(from.size() - 1));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: