Bootstrap

java递归解决汉诺塔问题(计算移动次数)

汉诺塔 :思路直接写在程序中,是对递归的应用,不论原本有多少个圆盘,都将圆盘看成两部分:前n-1个和第n个,这样便于理解,等效于只有两个圆盘的思路。

import java.util.Scanner;

public class HNT {
    public static void main(String[] args) {
        //定义圆盘的个数
        int n = 0;
        //三个柱子用A,B,C表示
        char a = 'A', b = 'B', c = 'C';
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入圆盘的个数:");
        while (scanner.hasNext()) {
            n = scanner.nextInt();
            HanNuoTa hanNuoTa = new HanNuoTa();
            hanNuoTa.test(n, a, b, c);//调用汉诺塔的方法
            System.out.println("输入圆盘的个数:");
        }
    }
}

class HanNuoTa {
    public int count;//记录移动的总次数

    public void test(int n, char a, char b, char c) {
        if (n == 1) {
            //如果只有一个盘,则直接移到C柱,递归的出口
            move(1, a, c);
        } else {
            //先将前n-1个圆盘借助C柱从A移动到B
            test(n - 1, a, c, b);
            //将剩下的第n个盘移动到C柱
            move(n, a, c);
            //继续将剩下的n-1个盘从B借助于A移动到C柱
            test(n - 1, b, a, c);
        }
    }

    private void move(int i, char a, char c) {
        count++;
        System.out.println(i + " " + a + "-->" + c + "  共移动" + count + "次");
    }
}
;