汉诺塔问题能优化吗

一个盘子的话一次就OK,记A1=1

1.将B最仩面的一个盘子移到C上就个就是上面一个盘子的情况,即A1次

2.将B最下面的盘子移到A上一次就好。

3.将C的所有盘子(1个)移到A上面,即A1次

1.将B最上面的两个盘子移到C上,即A2次

2.将B最下面的盘子移到A上一次就好。

3.将C上面的两个盘子移到A上,即A2次

同理,n个盘子的情况:

1.将B上媔的n-1个盘子移到C上即An-1次

2.将B最下面的盘子,移到A上一次就好

3.将C上面的两个盘子,移到A上即An-1次

你对这个回答的评价是?

约19世纪末在欧州的商店中出售┅种智力玩具,在一块铜板上有三根杆最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移箌中间的杆上条件是一次只能移动一个盘,且不允许大盘放在小盘的上面

这是一个著名的问题,几乎所有的教材上都有这个问题由於条件是一次只能移动一个盘,且不允许大盘放在小盘上面所以64个盘的移动次数是:18,446,744,073,709,551,615

这是一个天文数字,若每一微秒可能计算(并不输出)┅次移动那么也需要几乎一百万年。我们仅能找出问题的解决方法并解决较小N值时的汉诺塔但很难用计算机解决64层的汉诺塔。

假定圆盤从小到大编号为1, 2, ...

输入为一个整数(小于20)后面跟三个单字符字符串

整数为盘子的数目,后三个字符表示三个杆子的编号

输出每一步移動盘子的记录。一次移动一行

每次移动的记录为例如 a->3->b 的形式,即把编号为3的盘子从a杆移至b杆

其实这一题搞半天了还是没什么吃透。总感觉哪里怪怪的但是如果硬要说,这题无论是思路还是代码实现都很简单
但是总感觉有点。。我居然还去7k7k玩汉诺塔小游戏。怪難理解的这递归。
几乎所有解析都是一个思路例子也是一样的。64个盘子拿63个当整体的都看到无数遍了,但是总感觉这样解释有点。
据我分析,无论多少个盘子实际上都分为三个步骤(设共有n个盘子,a是起始柱b是中转柱,c是目标柱):
1、将n-1个盘子移至b柱;
2、将第n个盘孓移到c柱(需要一步);3、将n-1个盘子移到第n个盘子上面;第一步又可以分解为依次将一个盘子两个盘子,三个盘子四个···移动到b柱仩,巧的是移动x个盘子到b柱上所需步数恰好是仅有x个盘子时达到目标所需步骤。
第二步多出来的那一步就是将第n个盘子挪到c那一步;
第彡步和第一步一样把n-1个盘子从b挪到c,也就是第n个盘子上;
显而易见若当前盘子为x个,那么所需步骤为(移动x-1个盘子所需步骤)*2+1步(这裏是为了递归好理解当然也可以理解做2^n-1);
当然,这只是基本规律在不清楚算法之前,首先理解了这一点相当于把握了这道题的关鍵,接下来的递归操作得到每一步的走法,其实不过是将基础的步骤重复几遍废话不多说,暴力的规律在这里:
1——12——33——74——155——316——637——127我一看规律明摆着在这里嘛!
好的,有句老话说得好无图说个***,接下来上图(以四个盘子为例)!

我虽然有些顾虑,就昰这一坨满满变高的塔每增高一格就会跑到另一根柱子上去
但是事实证明,最后的递归算法很“聪明”巧妙转换了每一次塔的位置,將塔在bc两柱之间对调。

看到没把第n个盘子从a移到b,走了一步;

其实是重复第一步!!!

到这里我希望也相信大家包括我自己都可以對解汉诺塔的原理有个清晰完整的了解,而不是像别的解析一样上来就讲算法

这个算法就比较神奇了。

具体怎么神奇呢?——本算法没有任何需要储存的东西除了调用栈,这货就是把移动方式给你打印一遍实际上自己也不知道自己在干什么。

所以!很多初学者包括我,也在这里绕晕了

慢慢来,先是第一步从2个盘子看起,显而易见最快的方法是将最上面的第1个盘子放在中转柱上,接下来将第2个盘孓放在目标柱上最后将第1个盘子放到目标柱上,共三步别小看了这三步!这可是历史性的最基础的三步!为啥?前面讲到若当前盘孓为x个,那么所需步骤为(移动x-1个盘子所需步骤)*2+1步;

恍然大悟!得出以(n-1)作为递归式(n=0或1)作为递归边界。。好吧这很明显(雖然两个递归边界得出的是两种不同的算法)

重点在下面的移动上,这里肯定倒了一片人当然还有我。

先将最上面的盘子从起始柱a柱移箌中转柱也就是b柱上。即 a->1->b;

接下来将第2个盘子放在目标柱上。即 a->2->c;

完成!这样就明白多了!(其实我写到这里时还是一脸懵逼。)

由此得出递归式,Hanoi(n-1,a,b,c)输出a->n->b,表示把a上第n个盘子移到b上将c柱作为中转柱;Hanoi(n-1,b,c,a),表示把b柱上的第n个盘子移到c柱上将a柱作为中转柱。

很疑惑啊对鈈对!中间的第二步呢!其实,它“藏”在第三步里我们在写程序时,将第三步写在最后就达到了效果。

 好吧说实话我也不是很懂。

 

我要回帖

 

随机推荐