Java中的汉诺塔

让我们先来看看什么是汉诺塔!!!!

法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?这里需要递归的方法。假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。n=64时,

假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下:

18446744073709511615秒

这表明移完这些金片需要5845.54亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。

以上便是汉诺塔的由来...

汉诺塔,由三根柱子和64个金圆盘所组成,问题就是将64个依次排列的上小下大的圆盘从第一个柱子转移到第三个柱子依旧保持上小下大的形式,一共需要完成多少次。

图一

图二

汉诺塔,便是完成上述从图一到图二的操作,含容易可以看出来,每次只可以移动一个圆盘的话,先比如说有3个圆盘,需要移动,那么移动的方式(步骤)如下:

1.x的前两个先移动到y

2.然后x的最后一个从x到z

3.y上面的两个从y到z

以上便是大范围的操作,还有比如说,如何把x的前两个先移动到y ,当然要先借助z才可以完成,具体如何实现看代码。

class Hanno{
    public static void main(String[] args){
        //盘子的个数 出发 中间 目的
        hanno(64,"X","Y","Z");
    }                                     
    public static void hanno(int n,String begin,String mid,String end){
        if(n==1){
            System.out.println(begin+" -> "+end);
        }else{
            hanno(n-1,begin,end,mid);
            System.out.println(begin+" -> "+end);
            hanno(n-1,mid,begin,end);
        }
    }
}
/*
最大的问题将X上的三个盘子放到Z上
3个 X->Z
    前2个 X->Y
        前1个 X->Z
        第2个 X->Y
        前1个 Z->Y
    第3个 X->Z
    前2个 Y->Z
        前1个 Y->X
        第2个 Y->Z
        前1个 X->Z
64个 X->Z
    前63个 X->Y
        前62个 X->Z

        第63个 X->Y
        前62个 Z->Y
    第64个 X->Z
    前63个 Y->Z
        前62个 Y->X
        第63个 Y->Z
        前62个 X->Z

*/

汉诺塔,最困难的便是在于如何理解圆盘的大方向移动,最简单的先理解3个圆盘的移动,坚守一个原则,必须保证上小下大,且一次只可以移动一个圆盘。

发布了12 篇原创文章 · 获赞 0 · 访问量 81

猜你喜欢

转载自blog.csdn.net/fuguofenA/article/details/104326631
今日推荐