用递归解决问题

汉诺塔是根据一个传说形成的数学问题:

有三座塔A,B,C。开始时A塔上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。每次只能将一个圆盘从一座塔移动至另一座塔,且不能将圆盘放在任何比它小的圆盘上。如何将所有圆盘移至C塔?

解决传统的汉诺塔问题时一般会应用递归的思想。

当N=1时,只要把它从A塔移至C塔便宣告完成。当N>1时,可将这个问题分为三步:

  1. 将全部N-1个盘子从A塔移至B塔;
  2. 将第N个盘子从A塔移至C塔;
  3. 将全部N-1个盘子从B塔移至C塔。

当考虑如何将全部N-1个盘子从A塔移至B塔时,可以依照上面的思路如法炮制。只不过此时应当将B塔与C塔对调。最终,我们可以把这个问题简化为数个简单的步骤。

import java.util.Scanner;

public class Hanoi {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("盘子个数: ");
        int n = input.nextInt();
        System.out.println("解法:");
        moveDisks(n, "起始", "中间", "目标");
    }
    static int count = 0;
    public static void moveDisks(int n, String fromTower, String auxTower, String toTower) {

        if (n == 1) {
            count++;
            System.out.println("第 " + count +" 步: 将 " + n + " 号盘从" +
                    fromTower + "塔移至" + toTower + "塔");
        }
        else {
            count++;
            moveDisks(n - 1, fromTower, toTower, auxTower);
            System.out.println("第 " + count +" 步: 将 " + n + " 号盘从" +
                    fromTower + "塔移至" + toTower + "塔");
            moveDisks(n - 1, toTower, auxTower, fromTower);
        }
    }
}

 

posted @ 2017-10-22 21:18  望山海  阅读(458)  评论(0编辑  收藏  举报