源程序HanoiTower.java
public
class
HanoiTower
...
{
// 将n个盘从from柱移到to柱,以aux柱为辅助柱
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public static void move(int n, char from, char to, char aux) ...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (n == 1) ...{
// 仅有一个盘时,直接从from柱移到to柱
System.out.println("将#1盘从 " + from + " 移到 " + to);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} else ...{
// 将n - 1个盘从from柱移到aux柱,以to柱为辅助柱
move(n - 1, from, aux, to);
// 将最下的圆盘从from柱移到to柱
System.out.println("将#" + n + "盘从 " + from + " 移到 " + to);
// 将n - 1个盘从aux柱移到to柱,以from柱为辅助柱
move(n - 1, aux, to, from);
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public static void main(String[] args) ...{
// 将4个圆盘从A柱移到C柱,移动时利用B柱为辅助柱
move(3, 'A', 'C', 'B');
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
原则就是要把from柱的所有盘子移到to柱上去,比如首先要想办法把上面的2个盘子移到B柱,再把最大的一个盘子移到C。对于2个盘子要移到B柱又要先想办法把最小的盘子移到一个柱子,再把第2小的盘子移到B柱。
为此将n维问题转化为n-1维问题,利用递归,可以很好的解决此问题
运行结果
将#1盘从 A 移到 C
将#2盘从 A 移到 B
将#1盘从 C 移到 B
将#3盘从 A 移到 C
将#1盘从 B 移到 A
将#2盘从 B 移到 C
将#1盘从 A 移到 C