汉诺塔的实现 --Java版(模拟打印出所有挪动的路径)

目录

什么是汉诺塔?

模拟一下汉诺塔

代码部分的实现

移动部分代码块如下:

汉诺塔调用移动部分的代码:

整体关于汉诺塔的实现代码:

输出的结果:(测试了有三个盘子的情况下的移动情况)

总结:


什么是汉诺塔?

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

模拟一下汉诺塔

如图,当我们有一个盘子时,只需要从A挪动到C,只需要挪动1步。

汉诺塔的实现 --Java版(模拟打印出所有挪动的路径)_第1张图片

 当我们有两个盘子时,需要将A上的盘子,挪动到C,为了保证始终是大盘在下小盘在上,这就需要借助位置B,(1)将A上小盘挪到B,将A的大盘挪到C,再将B上的盘子挪到C,此时需要挪动三步。

汉诺塔的实现 --Java版(模拟打印出所有挪动的路径)_第2张图片

 同理,当有三个盘子的时候,同样是借助B将A上的盘子挪到C上,同时满足小盘在上,大盘在下。

经过上述分析,完成汉诺塔需要三个位置,起始位置,中转位置以及目标位置,除此之外还需要创建一个新的移动函数表示把除了最下面的盘子外的其他盘子从位置1挪到位置2.

代码部分的实现

移动部分代码块如下:

 /**
     *
     * @param pos1 起始位置
     * @param pos2 目标位置
     */
 public static void move(char pos1,char pos2){
        System.out.print(pos1+" -> "+pos2+" ");
    }

汉诺塔调用移动部分的代码:

  /**
     *
     * @param pos1 起始位置
     * @param pos2 中转位置
     * @param pos3 目标位置
     */ 
public static void hanio(int n,char pos1,char pos2,char pos3){
        if(n == 1){
            move(pos1,pos3);
            return;
        }
        hanio(n-1,pos1,pos3,pos2);
        move(pos1,pos3);
        hanio(n-1,pos2,pos1,pos3);

    }

整体关于汉诺塔的实现代码:

public class Test {
    /**
     *
     * @param pos1 起始位置
     * @param pos2 中转位置
     * @param pos3 目标位置
     */

    public static void hanio(int n,char pos1,char pos2,char pos3){
        if(n == 1){
            move(pos1,pos3);
            return;
        }
        hanio(n-1,pos1,pos3,pos2);
        move(pos1,pos3);
        hanio(n-1,pos2,pos1,pos3);

    }

    /**
     *
     * @param pos1 起始位置
     * @param pos2 目标位置
     */
    public static void move(char pos1,char pos2){
        System.out.print(pos1+" -> "+pos2+" ");
    }

    public static void main(String[] args) {
        hanio(1,'A','B','C');
        System.out.println();
        hanio(2,'A','B','C');
        System.out.println();
        hanio(3,'A','B','C');
    }

}

输出的结果:(测试了有三个盘子的情况下的移动情况)

汉诺塔的实现 --Java版(模拟打印出所有挪动的路径)_第3张图片

 

总结:

汉诺塔规定的是64个盘子,但是这里只给了3个盘子举例,要想真的完成64个盘子的移动在宇宙存在的这些时间里靠人为移动也是不可能的,汉诺塔更加深了我对递归的了解,对编程也产生了新的一些认知,继续加油吧!

你可能感兴趣的:(Java,java,idea,开发语言)