
Java完美实现经典汉诺塔问题
发布日期:2021-05-08 21:34:21
浏览次数:17
分类:精选文章
本文共 941 字,大约阅读时间需要 3 分钟。
汉诺塔问题:递归解决思路与代码实现
问题背景
汉诺塔问题源自印度神话,描述了一个复杂的盘塔移动任务。传说中,有三根金色金刚柱,分别用A、B、C表示。A塔上叠放着从上到下依次变小的64个黄金圆盘,最上面是1号,最下面是64号。规则是:任何时候只能将一个圆盘放置在比它大的圆盘上。婆罗门被命令将64个圆盘全部从A塔移动到C塔,借助B塔完成任务。
解决思路
汉诺塔问题的递归解决方案基于以下逻辑:
单盘情况:只需将A塔的1号盘直接移动到C塔。
双盘情况:先将A塔的1号盘移动到B塔,再将A塔的2号盘移动到C塔,最后将B塔的1号盘移动到C塔。
多盘情况:将A塔上1至n-1号盘借助B塔(即C塔)移动到B塔,然后将A塔的n号盘移动到C塔,最后将B塔上的n-1号盘借助A塔移动到C塔。这种递归模式适用于n>2的情况。
这种递归思路类似于递归算法的逻辑,通过不断分解问题,最终解决最简单的情况。
代码实现
public static void moveDish(int n, char a, char b, char c) { if (n == 1) { System.out.println(a + "->" + c); } else { moveDish(n - 1, a, c, b); // 将a塔的前n-1个盘子借助c塔移动到b塔 System.out.println(a + "->" + c); moveDish(n - 1, b, a, c); // 将b塔的n-1个盘子借助a塔移动到c塔 }}public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); moveDish(num, 'A', 'B', 'C'); sc.close();}
运行结果
输入任意数值n,程序会输出相应的盘子移动序列。例如:
输入:3
输出:A->CA->BB->CA->CB->AB->CA->BB->C
通过这种方式,可以清晰地观察到递归算法的执行过程。