Java 中的汉诺塔程序

2025年3月17日 | 阅读 3 分钟

汉诺塔是一个著名的数学谜题,由三个不同直径的圆盘和一对钉子组成。该谜题的目标是按照以下说明,将每个圆盘在钉子之间移动。

  1. 一次只能移动一个圆盘。
  2. 我们可以从一个叠中取走最上面的圆盘,然后将其放在另一个叠的顶部。
  3. 较小的圆盘不能堆放在较大的圆盘之上。

在本节中,我们将探讨汉诺塔问题的 Java 实现。我们将把问题分解成可管理的块,并为每个步骤提供详细的描述和相关的代码。

Tower of Hanoi Program in Java

步骤 1:定义汉诺塔方法

最初,我们必须为汉诺塔问题开发一个递归解决方案。该方法应包含以下参数:

  1. 要移动的圆盘数量 (n)
  2. 应从中移动圆盘的钉子或塔 (源)
  3. 应将圆盘移动到的钉子或塔 (目标)
  4. 移动圆盘时可用的辅助钉子或塔 (辅助)

这是方法签名:

步骤 2:定义基本情况

汉诺塔问题是递归问题的著名示例。对于递归问题来说,必须有一个基本情况才能结束。在本例中,当只需要移动一个圆盘时,就出现了基本情况。

步骤 3:将 n-1 个圆盘移至辅助钉子

为了解决 n 个圆盘的汉诺塔问题,我们必须首先将 n-1 个圆盘从源钉子移至辅助钉子。此步骤需要对 towerOfHanoi() 方法进行递归调用。

步骤 4:将最大的圆盘移至目标钉子

一旦我们将 n-1 个圆盘移至辅助钉子,就可以将最大的圆盘从源钉子移至目标钉子。

步骤 5:将 n-1 个圆盘从辅助钉子移至目标钉子

最后,我们需要将 n-1 个圆盘从辅助钉子移至目标钉子。此步骤再次涉及对 towerOfHanoi() 方法的递归调用。

汉诺塔 Java 程序

TowerOfHanoi.java

输出

Move disk 1 from A to C
Move disk 2 from A to B
Move disk 1 from C to B
Move disk 3 from A to C
Move disk 1 from B to A
Move disk 2 from B to C
Move disk 1 from A to C

解释

当只有一个圆盘时 (n == 1),toh() 方法的基本情况会触发它显示将圆盘从源钉子移动到目标钉子的动作。对于多个圆盘,toh() 方法利用递归来解决汉诺塔问题。它首先将 n-1 个圆盘从源钉子移动到辅助钉子,将目标钉子用作辅助。

之后,它将第 n 个圆盘从源钉子移动到目标钉子。最后,该方法递归地处理 n-1 个圆盘,将它们从辅助钉子移动到目标钉子,同时将源钉子用作辅助。