java求解汉诺塔问题示例


在Java中,汉诺塔问题是一个经典的递归问题。汉诺塔(Tower of Hanoi)是一个源自印度古老传说的益智玩具。它由三根柱子和不同大小的圆盘组成,目标是把所有盘子从一个柱子移动到另一个柱子,且一次只能移动一个盘子,并且大盘子不能放在小盘子上面。

以下是一个简单的Java程序,演示了如何解决汉诺塔问题:


public class HanoiTower {

    /**
     * 解决汉诺塔问题的递归方法
     * 
     * @param n 盘子的数量
     * @param from 起始柱子
     * @param to 目标柱子
     * @param aux 辅助柱子
     */
    public static void hanoi(int n, char from, char to, char aux) {
        if (n == 1) {
            // 如果只有一个盘子,直接移动到目标柱子
            System.out.println("Move disk 1 from " + from + " to " + to);
        } else {
            // 先将n-1个盘子从起始柱子移动到辅助柱子
            hanoi(n - 1, from, aux, to);
            // 将最大的盘子从起始柱子移动到目标柱子
            System.out.println("Move disk " + n + " from " + from + " to " + to);
            // 最后将n-1个盘子从辅助柱子移动到目标柱子
            hanoi(n - 1, aux, to, from);
        }
    }

    public static void main(String[] args) {
        int n = 3; // 盘子的数量
        hanoi(n, 'A', 'C', 'B'); // A是起始柱子,C是目标柱子,B是辅助柱子
    }
}

这段代码首先定义了一个`hanoi`方法,它使用递归的方式来解决汉诺塔问题。`n`代表盘子的数量,`from`是起始柱子,`to`是目标柱子,`aux`是辅助柱子。当只有一个盘子时,直接将其从起始柱子移动到目标柱子。否则,首先将所有较小的盘子(`n-1`个)通过目标柱子移动到辅助柱子上,然后将最大的盘子移动到目标柱子上,最后将之前移动到辅助柱子上的所有盘子移动到目标柱子上。

在`main`方法中,我们调用`hanoi`方法,假设有3个盘子,并且指定了起始柱子、目标柱子和辅助柱子的标识。运行这个程序,将输出盘子移动的具体步骤。