天天看点

对汉诺塔java实现的理解记录

参考链接 https://blog.csdn.net/zandaoguang/article/details/76889284
参考链接 https://blog.csdn.net/qq_37873310/article/details/80461767

汉诺塔的原理就不多说了,请参考以上两篇文章。

在理解汉诺塔的过程中对以上两篇文章的变量名产生过迷惑,在理解了之后,将函数中的变量名从A,B,C修改为src、tmp、dest貌似稍微清楚了一些,详情参考源码:
      
public class Hano {

    static int m = 0;// 标记移动次数

    public static void move(int diskNum, char N, char M) {
        System.out.println("第" + (++m) + " 次移动 : " + " 把 " + diskNum + " 号圆盘从 " + N + " ->移到->  " + M);
    }
    // n为圆盘编号,src为源柱子,tmp为中转用的柱子,dest为目的柱子
    public static void hano(int n, char src, char tmp, char dest) {
        if (n == 1) //最上层圆盘直接从 src移动到dest
            move(1, src, dest);
        else {
            hano(n - 1, src, dest, tmp);  //将n-1号及以上的圆盘从src移动到tmp,dest做中转
            move(n, src, dest);//将n号圆盘从src移动到dest
            hano(n - 1, tmp, src, dest);//将n-1号及以上的圆盘从tmp移动到dest,src做中转
        }
    }

    public static void main(String[] args) {
        char A = 'A';
        char B = 'B';
        char C = 'C';
        hano(3, A, B, C);//起始目标,将小于等于3号的圆盘,从A移动到C,B作为中转
    }
}