`
阅读更多

汉诺塔的由来


传说一

开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小, 依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。计 算结果非常恐怖(移动圆片的次数)18446744073709551615,众僧们即便是耗尽毕生精力也不可能完成金片的移动了。

 

由于条件是一次只能移动一个盘,且不允许大盘放在小盘上面,所以64个盘的移动次数是:            18,446,744,073,709,551,615

 

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


传说二

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

 

递归算法


首先,考虑A杆上只有一个盘子(这样是递归的终止条件),任务变成:

   *将A杆上的唯一一个盘子移到C杆上;

 

然后,考虑A杆最下面的一个盘子而非上面的一些盘子,于是任务变成了:
   *将上面的63个盘子移到B杆上;
   *将A杆上剩下的盘子移到C杆上;
   *将B杆上的全部盘子移到C杆上。

将这个过程继续下去,就是要先完成移动63个盘子、62个盘子、61个盘子....的工作。

 

为了更清楚地描述算法,可以定义一个函数hanoi(n,a,b,c)。该函数的功能是将N个盘子从A杆上借助B杆移动到c杆上。这样移动N个盘子的工作就可以按照以下过程进行:
      1) hanoi(n-1,a,c,b);
      2) 将一个盘子从a移动到c上;

      3) hanoi(n-1,b,a,c);
重复以上过程,直到将全部的盘子移动到位时为止。

 

汉诺塔算法的递归实现C++源代码

Please find the source file in attachement - hanoi_recursive.cpp

 

g++ -o hanoi_recursive hanoi_recursize.cpp

 

汉诺塔算法的递归实现C源代码

Please find the source file in attachement - hanoi_recursive.c

 

gcc -o hanoi_recursive1 hanoi_recursive.c

 

非递归算法

当盘子的个数为n时,移动的次数应等于2^n - 1(有兴趣的可以自己证明试试看)。后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C;若n为奇数,按顺时针方向依次摆放 A C B。


(1)按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。
(2)接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。
(3)反复进行(1)(2)操作,最后就能按规定完成汉诺塔的移动。

所以结果非常简单,就是按照移动规则向一个方向移动金片,如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C

 

汉诺塔算法的非递归实现C++源代码

 

Please find the source file in attachement - hanoi_non_recursive.cpp

 

g++ -o hanoi_non_recursive hanoi_non_recursive.cpp

分享到:
评论

相关推荐

    最新最精彩汉诺塔HanoiTower

    总的来说,"最新最精彩汉诺塔HanoiTower"是一款利用C++编程语言并结合多线程技术开发的汉诺塔游戏,具有丰富的图形界面和动态调速功能,支持多达32个盘子的挑战,旨在为用户提供一种既有趣又有挑战性的娱乐体验。...

    python编程小游戏汉诺塔hanoi

    这是使用python语言编程的小游戏,汉诺塔hanoi,欢迎大家下载

    汉诺塔 hanoi C代码

    汉诺塔游戏是一种经典的递归问题,源自印度的古老传说,通常用三根柱子(A、B、C)和一堆大小不一的圆盘来表示。在这个游戏中,目标是将所有圆盘从柱子A移动到柱子C,但每次只能移动一个圆盘,并且任何时候大盘子都...

    C#图形界面汉诺塔Hanoi

    汉诺塔(Hanoi)游戏是一个经典的递归问题,它涉及到三个柱子和一堆不同大小的圆盘。玩家需要将所有圆盘从一个柱子移动到另一个柱子,每次只能移动一个圆盘,并且任何时候大盘子都不能位于小盘子之上。在C#环境下,...

    MFC 汉诺塔 hanoi

    汉诺塔(Hanoi Tower)是一个经典的递归问题,源于19世纪的法国数学家艾德蒙·朗利。在MFC(Microsoft Foundation Classes)框架下实现汉诺塔游戏,可以提供一个直观的用户界面,让用户通过鼠标操作来解决这个问题。...

    汉诺塔 hanoi.cpp 用C++实现

    void hanoi(int n,char a,char b,char c) 实现汉诺塔的程序,用递归.

    汉诺塔 Hanoi

    汉诺塔(Hanoi)问题,也称为艾斯特拉达问题或移塔问题,是一个经典的递归算法问题,源于19世纪由法国数学家艾德蒙·朗利所提出。问题的目标是将一个堆栈中的所有盘子,通过三个柱子在有限步骤内从初始柱子A移动到...

    汉诺塔的递归算法 C++

    用C++实现汉诺塔的递归算法,定义了类和方法。

    汉诺塔 (hanoi) c++

    汉诺塔(Hanoi Tower)是一个经典的递归问题,它涉及到三个柱子和一堆不同大小的圆盘。问题的目标是将所有圆盘从一个柱子(通常称为起始柱或A柱)移动到另一个柱子(目标柱或C柱),但每次只能移动一个圆盘,并且...

    10_05 V4 (汉诺(Hanoi)塔问题).cpp

    汉诺(Hanoi)塔问题

    汉诺塔 hanoi

    汉诺塔, 用递归实现,递归里面的经典问题。问题是源于印度一个古老传说的益智玩具

    汉诺塔_Hanoi_

    汉诺塔(Hanoi)问题是一个经典的递归问题,源于法国数学家爱德华·卢卡斯在19世纪末提出的智力游戏。这个游戏涉及到三根柱子和一堆大小不一的圆盘,每根柱子上可以放置圆盘。游戏的目标是将所有圆盘从第一根柱子...

    汉诺塔 源代码 -汉诺塔小程序

    ---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码---

    汉诺塔演示程序(包含二叉树的演示动画)

    汉诺塔演示程序结合了二叉树的演示动画,为学习和理解这两种计算机科学基础知识提供了一个生动直观的方式。首先,我们来深入探讨一下汉诺塔问题及其解决方案。 汉诺塔是一个经典的递归问题,由三个柱子和一堆大小...

    汉诺塔演示程序 HanoiTower

    汉诺塔(Hanoi Tower)演示程序是一款基于Visual Studio(VS)平台,使用C++编程语言编写的软件。它提供了一个交互式的环境,用于理解和学习经典的汉诺塔问题。汉诺塔问题是一个著名的数学和计算机科学问题,由三个...

    flash小游戏汉诺塔-Flash文档类资源

    汉诺塔(Hanoi Tower)是一款经典的逻辑游戏,源自19世纪由法国数学家艾德蒙·洛卡特(Edouard Lucas)提出的数学问题。它通常由三根圆柱和一堆不同大小的圆盘组成,玩家的目标是将所有圆盘从一根柱子移动到另一根...

    java实现汉诺塔演示及手动操作汉诺塔

    汉诺塔是一个经典的递归问题,它源自一个古老的印度传说。在这个问题中,有三个柱子和一堆不同大小的圆盘,目标是将所有圆盘从一个柱子移动到另一个柱子,遵循以下规则: 1. 一次只能移动一个圆盘。 2. 不允许将大...

    flash小游戏汉诺塔

    汉诺塔(Hanoi Tower)是一款经典的逻辑益智游戏,起源于19世纪末的法国,由数学家爱德华·卢卡斯提出。在这个游戏中,有三根柱子和一堆大小不一的圆盘,起初都堆在第一根柱子上,按照从大到小的顺序自下而上排列。...

    汉诺塔(hanoi)代码(输出移动过程)

    汉诺塔 vc6编译,输入要挪动的盘子数,输出搬运过程。

Global site tag (gtag.js) - Google Analytics