重温汉诺塔
上高中时,在同学的文曲星上第一次看到汉诺塔这个游戏,靠着机械的背诵,勉强可以玩过几关。当时觉得很好玩,也很难,也没有多想。后来学习计算机,知道了这个汉诺塔这个东西中其实还蕴含着数学的道理,觉得是个奇妙的发明。
今天看书,突然看到了汉诺塔的解法的伪代码,觉得挺好的,于是Google了一下汉诺塔的由来,分享一下。
汉诺塔的由来
汉诺塔是源自印度神话里的玩具。(一直以为是中国发明的呢,嘻嘻)
上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。
上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
有人相信婆罗门至今还在一刻不停地移动着圆盘。
也有预言说,这件事完成时宇宙会在一瞬间闪电式毁灭。但是这一天什么时候到来,还是个未知?
写的还挺玄乎的,不过还挺有意思的。其实聪明的人早已算出来这天在什么时候了。呵呵,当然不是2012年啦,具体什么时候,看我娓娓道来。
程序伪代码:
Algorithm solveTowers( numberOfDisks, startPole, tempPole, endPole)
{
If(numberOfDisks > 0)
{
//所有盘子都在最左侧的柱子里,把最大的盘子以外的盘子都移动到中间的柱//子中
solveTowers( numberOfDisks - 1, startPole, endPole, tempPole);
//把最大的盘子移动到最右侧的柱子中
将汉诺塔的盘子从startPole移动到endPole
//把中间柱子中的盘子移到最右侧的柱子上
solveTowers( numberOfDisks - 1, tempPole,startPole, endPole);
}
}
看完了代码,按常理就会分析复杂度了。这类文章实在太多了,不过为了维护故事的完整性,总要写出结尾。
话说,令m(n)表示解决n个盘子的问题所要移动的此数。显而易见,m(1) = 1 。
对于上面的伪代码,当n > 1 时, 使用两个递归就是分别解决两个n – 1 盘子的问题。于是有
m(n) = m(n - 1) + 1 + m( n - 1) = 2m( n - 1) + 1
通过数学归纳,可以证明m(n) = 2^n – 1 ( n >= 1)
于是按照剧情,m(64) = 2^64 – 1 , 假如入移动每个盘子都要1秒的话,这个时间恐怕也要14038618016521年呢。到时候婆罗门王还玩不玩这个玩具还不知道呢。至于宇宙的存亡,嘿嘿,到时在说吧~~
- 大小: 10.7 KB
分享到:
相关推荐
汉诺塔是一个经典的递归问题,它源自一个古老的印度传说。在这个问题中,有三个柱子和一堆不同大小的圆盘,目标是将所有圆盘从一个柱子移动到另一个柱子,遵循以下规则: 1. 一次只能移动一个圆盘。 2. 不允许将大...
汉诺塔(Hanoi Tower)是一款经典的逻辑游戏,源自19世纪由法国数学家艾德蒙·洛卡特(Edouard Lucas)提出的数学问题。它通常由三根圆柱和一堆不同大小的圆盘组成,玩家的目标是将所有圆盘从一根柱子移动到另一根...
汉诺塔(Hanoi Tower)是一款经典的逻辑益智游戏,起源于19世纪末的法国,由数学家爱德华·卢卡斯提出。在这个游戏中,有三根柱子和一堆大小不一的圆盘,起初都堆在第一根柱子上,按照从大到小的顺序自下而上排列。...
汉诺塔游戏是一种基于递归算法的经典逻辑游戏,源自印度古老传说,由法国数学家爱德华·卢卡斯在19世纪末正式提出。在这个简单的汉诺塔HTML网页游戏中,玩家将体验到如何通过一系列合法移动将全部圆盘从一根柱子...
不过,对于想要学习或重温汉诺塔问题及C语言图形编程的人来说,这是一个很好的实践项目。你可以尝试下载并运行程序,通过阅读源代码来了解其实现方式,这将有助于深入理解递归和C语言的图形界面编程。
---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码---
算法分析设计中三柱汉诺塔算法的拓展,四柱汉诺塔的设计算法代码
汉诺塔(Hanoi Tower)是一个经典的数学游戏,通常用三根柱子和一堆不同大小的盘子来演示。在VRML(Virtual Reality Modeling Language,虚拟现实建模语言)中,我们可以利用其3D场景构建能力来模拟这个游戏。VRML是...
汉诺塔(Hanoi Tower)是一款经典的逻辑游戏,它源于印度的一个传说,旨在通过移动盘子来演示一个看似简单但实则复杂的问题解决过程。在Flash AS 3.0环境中,我们可以利用ActionScript这一强大的脚本语言来创建交互...
Scratch汉诺塔创意编程源程序汉若塔:由4-8个不同积木块和3根柱子组成游戏规则:1、一次只能移一个积木(柱子最上面)2、积木只能在三个柱子上存放3、任何时刻不允许大的压小的案例完美的诠释了什么是汉诺塔游戏,...
汉诺塔演示程序结合了二叉树的演示动画,为学习和理解这两种计算机科学基础知识提供了一个生动直观的方式。首先,我们来深入探讨一下汉诺塔问题及其解决方案。 汉诺塔是一个经典的递归问题,由三个柱子和一堆大小...
### C经典算法之双色汉诺塔 #### 双色汉诺塔算法解析 双色汉诺塔(Two-color Hanoi Tower)是基于传统汉诺塔游戏的一种变体。传统汉诺塔游戏由三个柱子及不同大小的圆盘组成,玩家的目标是将所有圆盘从初始柱子...
汉诺塔是一个经典的计算机科学问题,它源自印度的传说,要求将一堆盘子从一根柱子移动到另一根柱子,遵循以下规则:每次只能移动一个盘子,并且任何时候大盘子都不能位于小盘子之上。在C#中,解决汉诺塔问题通常采用...
汉诺塔是一个经典的递归问题,它源自印度的古老传说,涉及将一组圆盘从一根柱子移动到另一根柱子,遵循以下规则: 1. 每次只能移动一个圆盘。 2. 任何时候大盘子都不能位于小盘子之上。 在Java中实现汉诺塔的界面...
### 多柱汉诺塔问题研究 #### 引言与背景 汉诺塔问题作为一种经典的数学游戏,由法国数学家爱德华·卢卡斯在1883年提出。传统汉诺塔问题包含三个柱子及多个不同大小的圆盘,玩家的目标是将所有圆盘按照一定规则从...
汉诺塔是传统的智力游戏,与华容道、魔方等类似。这是汉诺塔游戏的Python源代码,使用了基本的递归方式实现汉诺塔求解问题。 欢迎大家下载。
汉诺塔模拟程序是一种基于Java语言的编程任务,旨在帮助学生深入理解和应用数据结构、算法以及GUI设计。这个课程设计的主要目标是通过实现汉诺塔问题的解决方案,提高学生的编程技能,尤其是对Java语言的理解和实际...
汉诺塔游戏是一种经典的逻辑谜题,源自19世纪的法国,由数学家艾德蒙·洛卡特提出。这个游戏的目标是将一个柱子上的所有盘子,通过另外两个柱子作为辅助,按照大小顺序从底部移动到顶部。在移动过程中,任何时候都不...
实验报告的主题是“数据结构”,具体探讨了汉诺塔问题的解决方案,这涉及到栈与队列这两种重要的数据结构。在本实验中,学生的主要任务是理解和应用这些数据结构的特点及算法。 1)栈(Stack)是一种后进先出(LIFO...