递归--Java_汉诺塔

背景:

有三根细柱(A、B、C)。A柱上套着5个圆盘。这些圆盘大小各异,按从大到小的顺序自下而上摆放。

现在要把套在A柱上的5个圆盘全部移到B柱上。并且在移动圆盘时遵守下述规则:

  • 一次只能移动柱子最上端的一个圆盘。
  • 小圆盘上不能放大圆盘。

 

 思考:

  • 1个圆盘直接将B;
  • 2个圆盘将第1个圆盘搬到C,然后将第2个圆盘搬到B,第一个圆盘再搬到B;
  • 3个圆盘将前2个搬到C,然后第3个圆盘搬到B,前2个圆盘搬到B;
  •     ...
  • n个圆盘将前n-1个搬到C,然后第n个圆盘搬到B,前n-1个圆盘搬到B:

                f(n-1)--->C

                f(n)--->B

                f(n-1)--->B

实现:

      

import java.util.Scanner;

public class Hanoi {

    private static Scanner in;
    private static int i;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        in = new Scanner(System.in);
        System.out.println("请输入需要移动的圆盘的个数:");
        int number = in.nextInt();
        char start = 'A';
        char end = 'B';
        char transfer = 'C';
        moveDisk(number, start, end, transfer);
        System.out.println("汉诺塔总共移动的次数:" + i);

    }

    public static void moveDisk(int n, char start, char end, char transfer) {

        if (n > 0) {
            // 因为小圆盘上不能放大圆盘,n-1块圆盘肯定是在中转站
            moveDisk(n - 1, start, transfer, end);
            // ‘最后一块’放到目的地
            System.out.println("第" + n + "个塔移动:" + start + "--->" + end);
            // 把n-1块送回到目的地
            moveDisk(n - 1, transfer, end, start);
            i++;
        }

    }

}

 

posted @ 2017-06-16 13:54  ninarMing  阅读(217)  评论(0编辑  收藏  举报