汉诺塔论文

合集下载

汉诺塔的感想和收获

汉诺塔的感想和收获

汉诺塔的感想和收获汉诺塔是一种经典的数学问题,也是一种富有挑战性的智力游戏。

通过解决汉诺塔问题,我不仅收获了数学思维的训练,还体会到了坚持不懈的力量和解决问题的策略。

我第一次接触汉诺塔是在学习数学课程时,老师以一种生动有趣的方式向我们介绍了这个问题。

汉诺塔由三根柱子和若干个不同大小的圆盘组成,目标是将所有的圆盘从一根柱子上移动到另一根柱子上,其中有以下规则:一次只能移动一个圆盘,大圆盘不能放在小圆盘上。

当我第一次尝试解决汉诺塔问题时,我感到非常困惑和无助。

我不知道从哪里开始,也不知道应该如何移动圆盘。

但是,我并没有放弃,我开始思考和尝试不同的方法。

我尝试了一个简单的方法,将圆盘从第一根柱子直接移动到第三根柱子上。

但是,随着圆盘数量的增加,这个方法变得越来越不可行。

我意识到我需要找到一种更有效的策略。

经过反复尝试和思考,我发现了一个重要的策略:递归。

递归是一种重要的数学思维方式,它可以将一个大问题分解为多个小问题,并通过解决小问题来解决大问题。

在汉诺塔问题中,我可以将移动n个圆盘的问题分解为移动n-1个圆盘的问题。

在解决汉诺塔问题时,我还学会了如何运用数学归纳法。

通过观察,我发现移动n个圆盘需要移动2^n-1次。

这个结论可以通过数学归纳法来证明:当圆盘数量为1时,只需要移动1次;假设移动n-1个圆盘需要移动2^(n-1)-1次,那么移动n个圆盘需要移动2^n-1次。

通过解决汉诺塔问题,我意识到了坚持不懈的力量。

在解决这个问题的过程中,我遇到了很多困难和挫折,但是我并没有放弃。

我不断尝试和思考,最终找到了解决问题的方法。

这让我明白了只要坚持下去,就一定能够克服困难,取得成功。

在解决汉诺塔问题的过程中,我还提高了我的逻辑思维能力。

解决汉诺塔问题需要分析和推理,找到最优的解决方案。

通过不断思考和尝试,我学会了如何进行逻辑推理,并将其应用到其他问题中。

汉诺塔问题不仅是一种数学问题,更是一种思维训练的方式。

从汉诺塔问题看递推关系在实际问题中的应用

从汉诺塔问题看递推关系在实际问题中的应用

从汉诺塔问题看递推关系在实际问题中的应用姓名:孙瑞 学号:200640501218 指导老师:马玉田摘要:本文主要介绍了递推关系在实际中的应用,对几个实际问题的分析,让我们清楚的看到递推关系在解决实际问的强大作用.关键词:数列 递推关系 汉诺塔 九连环 蛛网模型引言: 递推关系在实际问题中有着广泛的应用.由连续变量可以建立微分方程模型,离散变量可以建立递推关系模型. 经过分析可知,常、偏微分方程除非在极其特殊的情况下,否则一般不存在解析解,所以讨论起来非常麻烦,比如最基本的平衡点的稳定性,往往只能得到局部稳定性,全局稳定性很难得到,而递推关系模型可以达到全局的效果,另外,由递推关系获得的结果又可以进一步进行优化分析、满意度分析、分类分析、相关分析等等。

而在实际中,连续变量可以用离散变量来近似和逼近,从而微分方程模型就可以近似于某个递推关系模型。

递推关系模型有着非常广泛的实际应用背景,我们的前人建立了许多著名的模型,如生态模型,传染病模型,经济模型(如蛛网模型),人口控制模型(如著名的马尔萨斯人口控制模型)等等.定义:设012,,,,n a a a a 是一个数列,把该数列中n a 与它的前面几个(01)i a i n ≤≤-关联起来构成的方程,称为一个递推关系,即(,,)n j k a f a a =(0,1)j k n ≤≤-.下面让我们看看递推关系在汉诺塔问题中的应用.引例:汉诺塔(又称河内塔)问题是印度的一个古老的传说。

开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。

面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动汉诺塔问题:它是由三根固定的柱子ABC 和不同尺寸的n 个圆盘组成.开始时,这些个大小不同的圆盘依其半径大小依次套在A 柱上,使大圆盘在底下.游戏的规则是:每次的圆盘从一根柱子移到另一根柱子上,但是不允许这个圆盘放在比它小的圆盘上面.游戏的目标是把所有的圆盘从按照大小的次序从A 柱都移到C 根柱子上,可以利用中间的B 柱子,在移动过程中药始终将最大的圆盘放在最下面.令n H 表示解n 个圆盘的汉诺塔游戏所需要的移动次数,建立关于序列{n H }递推关系 解 开始时n 个圆盘在A 柱上,按照游戏规则用1n H -次移动将上面的1n -个圆盘移到C 柱子上,在这些移动中最大圆盘不动.然后,用1次移动将最大圆盘移到B 柱子上.再用1n H -次移动将C 柱子上的1n -个圆盘移到B 柱子上并且放到最大圆盘上面,于是,得到所求递推关系.121n n H H -=+和初始条件是11H =.因为根据游戏规则,一个圆盘可用1次移动从A 柱子放到B 柱子上.为求解上述递推关系,对该问题首先用构造方法导出其解公式如下:1232233123112212(21)12(21)21222122221222121n n n n n n n n n n n H H H H H H ---------=+=++=++=+++=+++++=++++=-其中11H =, 21nn H =-确是递推关系121n n H H -=+的解.现在我们再回头看看古印度的那个问题,勃拉玛要求移动64个圆盘,带入我们所求的关系式即是64642118446744073709551615H =-=,面对这个天文数字,庙中僧侣要想移动这64个圆盘几乎是不可能的.从汉诺塔问题我们看到递推关系在解决实际问题中的巨大作用,,它在众多领域里有着广泛的应用,由此我们看看由汉诺塔问题所引出的一些实际问题.(1)九连环方程问题九连环是中国古代在民间流传的一种玩具,它是由9个环,9个直杆,一个条形框柄和一个平板组成,.每一个环都有一根杆相连,又顺序穿入后一个环,再连在条形横板上,从而构成一个整体,与其相适应,大小相当的一个条形框柄,可以将9个环穿套在上下框柄.只有它前面的换单独在框柄上面.只是穿套不可能一次性完成,有着严格的规律性和特别的要求.第一个环可以独立,自由地上或下条形框柄,而其后的各环要上或下框柄都受其前面的连杆和环的限制,任何一个环要独立,自由地上下框柄只要它前面的换单独在框柄上就能做到.现在可以假设前n 个环已经全部上到框柄上,需要移动环的次数为S (1,2,9)n n = .这样,将前1n -个环都上到框柄上时,需要移动1S n -次,反之将前2n -个环下到框柄下.移动次数和之前的情形一样为2S n -,此时只有第1n -个环单独在框柄上,可将第n 个环上到框柄上,移动一次,再将前2n -环上到框柄上,移动次数为2S n -,至此,前面n 个环都上到框柄上,总的移动次数为12212S S 1S S 2S 1n n n n n -----+++=++,按假设,它等于S n ,所以有12S S 2S 1n n n --=++,补充定义0S 0=显然1S 1=(1,2,9)n = 这就是九连环的基本方程.利用它可以计算出2S 2=,并递推地求出S n .直接求解可将两边都加上和减去1S 1n -+,得:211S S 12(S S 1)2n n n n n ---++=++=和12S -S 12S n n n ---=,求平均得: 12S S 2n n n --=+,递推下去,有 +1+2324S S 2S S 2i i i n n n ---=+++=+ ,累加得111S S (22)3i n i n ++=+-,其中i 与n 同奇偶性,并且1i =或2.为求S i 和+12i ,可设S cos i u v n π+=,则有121u v u v +=-⎧⎨+=⎩, 解方程组,得 2,3u v ==, 所以1S (3cos )2i n π=+设+12cos i p q n π⋅+=,则有4181p q p q +=-⎧⎨+=⎩,解方程组得12p =,3q =-.所以有+122(3cos )i n π=+带入解表达式+111S S (22)3i n n i +=+-,有111S (3cos )[22(3cos )]23n n n n ππ+=++-+,整理,得1111S 2cos 326n n n π+=⨯--,这即是九连环方程的解.如果令1S S H n n n -+=表示第n 个环单独在框柄上要移动环的次数,代人基本方程,消去S 有1H 2H 1n n -=+,这可以视为九连环第二方程,也就是我们前面所提及的汉诺塔方程(2)递推关系在几何上的应用例1 一个人从坐标原点0(0,0)A 出发,通过点(1,0),1(1,1)A 然后再以折线通过整数坐标的点11122223(1,1),(2,1),(2,1),(2,2),(2,2),(2,2),(2,3),(3,3)B C D A B C D A ------- 试求此人沿着折线到点(,)m n 时所走的路程(0)m n >>.解:用0a 表示这个人由原点0(0,0)A 走到1(1,1)A 的路程, k a 表示此人由点(,)k A k k 走到点1(1,1)k A k k +++的路程,则当2k ≥时,由1(1,1)k A k k ---走到(,)k A k k 时经过的路程是1111(1,1)(1,1)(1,1)(,1)(,).k k k k k A k k B k k C k k D k k A k k ------→-+-→-+-+→-+→所以,得11111111(22)(22)(21)(21)86k k k k k k k k ka A B B C C D D A k k k k k --------=+++=-+-+-+-=-.因为此公式当1k=时得02a =,故数列{}n a 的通项公式186k a k -=-(1,2,3,)k = .当此人从 0(0,0)A 到(,)m A m m 时,走的路程是10m kk a-=∑,即1011112P (86)86(1)86422m mmk k k k a k k mm m m m m --====-=-+=⋅-=-∑∑∑.由点(,)m n 到点(,)m A m n 的路程为()m n -,故此人由原点0(0,0)A 走到点(,)m n 的路程是2242()43.m m m n m m n ---=-+在求图形中的无限个图形的面积或无限条线段长的和时,首先要确定这些面积或线段长所组成的数列.为此,要求出第一个图形的面积或第一条线段的长度,以及前后两个图形面积或线段之间的递推关系,然后再用有关的公式求和.例2 如图所示,在直角ABC ∆中, ABC=90,A=.θ︒∠∠自B 点出发,作1BD AC ⊥于1D ,作12D D AB ⊥于2D ,作23D D AC ⊥于3D , 依此做下去,得到无穷数列11223CB,BD ,D D ,D D ,(1) 求证: 11223CB+BD +D D +D D +>AB+AC . (2) 求证: 2222211223CB +BD +D D +D D +=AC .(3) 为使11223ABD,AD D ,AD D ,∆∆∆ 的面积之和不大于ABC ∆的面积,求θ的取值范围.解 (1)由已知条件可得1212BD BC cos ,D D BD cos BC cos ,θθθ=⋅=⋅=⋅在n n+1n+2Rt D D D ∆中可知: n+1n+2n n+1D D =D D cos θ (n=1,2,3,) .由上式联立可知,数列11223CB,BD ,D D ,D D , 是首项为CB ,公比为cos θ的等比数列,又因而它又是无穷递缩等比数列,故11223CBCB,BD ,D D ,D D ,1-cos θ=,CB (1cos )CBAB+AC=CBctg +sin sin θθθθ+⋅=, 从而CB (1cos )CB sin (1sin )CB 1cos sin (1cos )sin θθθθθθθ+⋅--=⋅--θ是锐角,故上式的值为正值,因此11223CB+BD +D D +D D +>AB+AC(2) 显然,数列222211223CB ,BD ,D D ,D D 是首项为2CB ,公比为2cos θ的无穷递缩等比数列,因此,222222112232222CB CB CB +BD +D D +D D +==1cos sin CB ==AC sin θθθ-⎛⎫ ⎪⎝⎭(3)1ABD 11112212311S =BD AD =BD (BD ctg )2211=BD ctg (BC cos )ctg 22BC cos ,2sin θθθθθθ∆⋅⋅⋅⋅=⋅= 又1ABD ∆∽12AD D ∆,于是1122ABD 2122AD D 1S D D ==cos S BD θ∆∆, ∴12ABD 2S(cos )ABD θ∆=∆.因为n n+1AD D ∆与n+1n+2AD D ∆相似,于是n+1n+2n n+12AD D 22n+1n+2n+1n+22AD D n n+1n n+1S D D D D ==()=cos S D D D D θ∆∆, ∴ n+1n+2n n+122AD D AD D S(cos )S θ∆∆=.由上式可知,数列11223ABD AD D AD D S ,S ,S ,∆∆∆ 是首项为23BC cos 2sin θθ,公比为2cos θ的无穷递缩等比数列,故1122323ABD AD D AD D 223232BC cos 2sin S +S +S 1-cos BC cos BC (ctg ),2sin 2θθθθθθ∆∆∆+=== 又2ABC 11S =AB BC=BC ctg 22θ∆⋅, 依题意令223BC BC (ctg )ctg 22θθ≤ ,得2tg 1θ≥. 于是在02πθ<<的条件下,得42ππθ≤<,因此,当42ππθ≤<时,11223ABD ,AD D ,AD D ,∆∆∆ 的面积之和不大于ABC ∆的面积.(3)递推关系在概率论中的应用随着科学技术的发展,递推关系在各个领域得到越来越多的应用,本文将介绍递推关系的一个简单的应用,即利用递推关系求概率问题.全概率公式是概率中一个最基本、最常用、最重要的公式.利用全概率公式列出递推关系,然后通过解递推关系求得概率,从而简化了应用全概率公式求解某些问题的复杂繁琐性.下面让我们看两个具体实例:例1 投掷硬币n 次,第一次出现正面的概率为c ,第二次后每次出现与前一次相同的表面的概率为p ,求第n 次出现正面的概率.解 设n A ={第n 次出现正面},则由全概率公式可得:111()()()()()n n n n nA A P A P A P P n P A n+++=+.(1)n n P p P p =+-即1(21)(1)n n P p P p +=-+- 由上述递推关系及初始条件1P c =当1p ≠时,有11[1(21)](21)2n n n p P c p ----=+-111(21)(21)22n n p c p ---=-+-111()(21)22n c p -=--+,当1p =时,有n P c ≡.例2 在每一次试验中,事件A 出现的概率p ,试问n 次独立试验中A 出现偶次的概率多少? 解 设n P 表示n 次独立实验中A 出现偶次的概率,则根据题意可列出关系式1(12)n n P p p P -=+-,用迭代法将其展开可得21222323221211110(12)(12)(12),(12)(12)(12),(12)(12)(12),(12)(12)(12).n n n n n n n n n n p P p p p P p P p p p P p P p p p P p P p p p P ----------=-+--=-+--=-+--=-+-其中,01P =,且上述表示对原方程组进行递推连锁变换,同乘以12p -,然后将上述n 个方程两边相加,约去含1P 至1n P -的各项,则21(12)(12)(12)(12)[1(12)](12)21(12),2n nn nnn P p p p p p p p p p p p pp -=+-+-++-+---=+-+-=(4) 递推关系在物理学中的应用递推关系在工程技术领域的某些方面有重要应用.原因在于递推关系方程满足许多领域的方程形式,而解法又满足n 阶常系数方程的形式.所以物理领域中的问题只要条件满足递推关系方程,一般都可以方便解之.下面以二阶齐次递推关系方程为例,略述其在物理方面的一些应用.例 如图l 所示系统,点0P 保持对地面的恒定电位0V ,试求1231,,,n P P P P - 各点的电位.分析: 根据Kirchhoff 定律:流入电路中任何节点的电流之和等于流出该节点的电流之和.因此在一般点1x P +(图2),可得11x x x i i I ++=+,由VI R =,可得:11212x x x x x V V V V V r r r++++--=+, 整理得 21502x x x V V V ++-+= (1)式(1)在2,3,,(2)x n =- 时成立,就是说在点1P 与1n P -之外的所有点上成立,在点1P 与1n P -,式(1)化为相应条件21052V V V -+= (0V 为已知) (2)22502n n V V ---+=(0n V =) (3) 方程(1)满足递推关系2105()02x E E E V -+=的形式, 故可采用递推关系方程求解,式(1)特征方程为25102M M -+=解得 112M = , 22M = 其全解为 1()22x xx V A B =+将其带入式(2)和(3)得05(4)(2)422A AB B V -+++=, 12125(2)(2)0222n n n n A AB B -----+++=, 求方程得 202221n nA V =- , 02121n B V =--, 所以电压的通解 20221(2)221xx x nV V π=--. 可以验之,在0x =和x n =点均满足上式. (5)市场经济中的蛛网模型经济背景与问题:在自由竞争的市场经济中,商品的价格是由市场上该商品的供应量决定的,供应量越大,价格就越低。

汉诺塔的作文

汉诺塔的作文

汉诺塔的作文Once upon a time, in the ancient kingdom of India, there stood a mysterious tower with three golden pegs. Upon these pegs rested a series of disks, each larger than the one below it, forming a graceful pyramid. This was the famous Tower of Hanoi, a puzzle that has challenged minds for centuries.The rules of the game are simple yet profound. The objective is to move all the disks from one peg to another, following two crucial guidelines: only one disk can be moved at a time, and no disk can be placed on top of a smaller one. This seemingly straightforward task becomes increasingly complex as the number of disks grows, requiring careful planning and precise execution.The solution to the Tower of Hanoi is recursive in nature, meaning that it involves repeating a pattern of moves on a smaller scale. This recursive structure is not only fascinating from a mathematical perspective, but it also speaks to the deeper principles of problem-solving and the beauty of simplicity.The puzzle of the Tower of Hanoi is not just a game; it is a meditation on order, logic, and the elegance of complexity. It teaches us that even the most intricate problems can be solved through a series of small, manageable steps. And as we move the disks, one by one, from one peg to another, we are reminded of the patience and focusrequired to overcome any challenge.古印度王国中,有座神秘的塔,塔上矗立着三根金柱子。

对汉诺塔问题的理解和认识

对汉诺塔问题的理解和认识

对汉诺塔问题的理解和认识
汉诺塔问题是一种经典的数学问题,也是一种著名的智力游戏。

它的规则很简单,但是玩法却很有趣。

问题的背景是有三个柱子,分别标号为A、B、C,A柱上有n个盘子,从上到下依次变大。

现在要将这n个盘子从A柱移到C柱,过程中可以借助B柱,但是要满足以下条件:
1. 每次只能移动一个盘子。

2. 盘子从上到下依次变大。

3. 在任意时刻,任何一个盘子都不能放在比它小的盘子上面。

对于初学者来说,理解和解决汉诺塔问题可能会有些困难,但是只要认真思考,就能找到解决方法。

实际上,汉诺塔问题的解决方法并不复杂,可以用递归算法来解决。

递归算法的基本思路是:将一个问题拆分成若干个相同或相似的子问题,再将子问题分解成更小的子问题,直到最后子问题可以简单而直接地求解,原问题的解即为子问题的解的合并。

对于汉诺塔问题,我们可以通过递归算法来解决。

具体来说,对于n个盘子,我们可以将其拆分成两个子问题:将前n-1个盘子从A柱移到B柱,将第n个盘子从A柱移到C柱,将前n-1个盘子从B柱移到C柱。

这样,我们就可以通过递归算法来解决汉诺塔问题。

通过对汉诺塔问题的理解和认识,我们可以不仅仅了解这个经典的数学问题,而且可以从中领悟到递归算法的精髓,进一步提高我们
的计算机科学素养。

同时,我们也可以将汉诺塔问题作为一种有趣的智力游戏,来锻炼我们的思维能力和创造力,享受智慧和快乐的乐趣。

对汉诺塔问题的研究

对汉诺塔问题的研究
因为要挪动n个盘子,则必须先把上面n-1个盘子挪动到B再把最下面的盘子挪动到c,在借助A柱把n-1个盘子挪动到c柱。;
,该方程为一阶差分线性非齐次方程,
对应的齐次线性方程为
: ,
该其次线性方程对应的特征方程为:
所以求得
对汉诺塔问题的研究
摘要
本文主要对汉诺塔问题进行了间单的分析并做出了相关叙述。针对模型建立过程中汉诺塔问题的差分方程以及通项公式求解问题,首先,通过分析并建立出模型;其次,求解该模型对应的特征方程以及特征根;最后,得到所求差分方程及通项公式。
关键词:差分方程,特征方程,特到小依次叠放的n个盘子借助B柱移到C柱上去,规则是一次只能移动一个盘子,大盘子不能放到小盘子之上。
二、问题分析
采用递归的方法来解:
(1)先将A上面的n-1个盘子,移到B柱上(期间借助C柱)
(2)然后把A上最大的一个盘子放到C柱上去
(3)然后把B上面的n-1个盘子移到A上去(期间借助C柱)
这是递归的思想:要算出n个盘子挪动的次数,可用差分方程建模求解:
三、模型的建立与求解
假设移动n个盘子的次数为 ;

关于汉诺塔的神话故事

关于汉诺塔的神话故事

关于汉诺塔的神话故事汉诺塔是一个古老而神秘的游戏,据说起源于印度的一个古老传说。

这个故事栩栩如生地描绘了一个智慧和勇气交织的传奇,以及人类对于解决难题和超越自我的渴望。

故事发生在一个古老的王国里,那时王国正面临一场空前的灾难。

据说神灵诺塔,守护王国的宝物,被囚禁在了一座高耸在云端的塔上。

为了解救诺塔,国王发布了一道难题:将塔上的金、银、铜三个圆盘重新摆放,使得每一个圆盘都从大到小有序地摆放在另一根柱子上。

然而,这道难题并非轻松可解,因为有一个重要规则:在移动圆盘的过程中,不能出现比它更大的圆盘放在它上面。

这个任务似乎是不可能完成的,因为在茫茫的圆盘中,最大的圆盘庞大无比,而且塔上的三根柱子也相对狭窄。

然而,有一位年轻的牧羊人蒙特内罗不愿意放弃。

他相信,只要运用自己的智慧和勇气,就能够解开这个谜题,拯救王国。

蒙特内罗没有仓促行事,而是耐心观察了塔上的情况。

他发现,每次移动圆盘的时候,都需要将某个柱子上较小的圆盘摆放在较大的圆盘上。

这样,他开始尝试不断地将小圆盘迭在大圆盘上,再一步步地移动到另一个柱子上。

他在实践中摸索出一种方法,即每次只能移动一个圆盘,并且只能用到从未被覆盖的柱子。

经过数日的努力,蒙特内罗终于找到了解决办法。

他通过反复移动圆盘,克服了一个又一个的困难,成功地将所有圆盘重新摆放在另一根柱子上。

全国响起了欢呼,王国的人民将蒙特内罗视为英雄。

他们相信,蒙特内罗的胜利不仅仅是一个游戏的胜利,更是智慧与勇气的胜利,是人类勤劳与奋斗的象征。

这个故事虽然只是一个游戏的背景,却蕴含着深刻的寓意。

汉诺塔游戏中的挑战,如同我们在现实生活中面临的困境和难题。

蒙特内罗的智慧和勇气代表着我们应对困境的决心和勇敢。

我们面临的困难也许不比汉诺塔的挑战逊色,但只要我们有坚定的意志和耐心,相信自己的能力,我们便能克服一切。

汉诺塔也告诉我们,解决问题并不是一蹴而就的,它需要长时间的思考和不断尝试。

类似地,我们在现实生活中解决问题也需要有耐心和毅力。

汉诺塔玩的作文

汉诺塔玩的作文

汉诺塔玩的作文The game of Hanoi Tower is an ancient puzzle that originated in China. 汉诺塔游戏是一种古老的益智游戏,起源于中国。

One perspective to consider in the game of Hanoi Tower is its mathematical properties. 这个游戏的数学属性是需要考虑的一个方面。

The Hanoi Tower puzzle consists of three rods and a number of disks of different sizes which can slide onto any rod. 汉诺塔谜题由三根杆和若干个不同大小的圆盘组成,这些圆盘可以滑动到任何杆上。

The objective of the game is to move the entire stack of disks from one rod to another, with the restriction that only one disk can be moved at a time and no disk can be placed on top of a smaller disk. 游戏的目标是将整个圆盘堆从一个杆移到另一个杆,受限制条件是每次只能移动一个圆盘,而且不能把一个较大的圆盘放在一个较小的圆盘上。

As the number of disks increases, the number of moves required to complete the puzzle increases exponentially. 随着圆盘数量的增加,完成谜题所需的步数呈指数增长。

The mathematical properties of the Hanoi Tower puzzle have been studied extensively, and it has been proven that the minimum number of moves required to solve the puzzle with n disks is 2^n - 1. 汉诺塔谜题的数学属性已经得到了广泛研究,已经证明解决带有n个圆盘的谜题所需的最小步数是2^n - 1。

汉诺塔论文——精选推荐

汉诺塔论文——精选推荐

汉诺塔论⽂⽬录⽬录 (1)摘要 (2)⼀、背景知识 (3)⼆、问题重述 (3)三、算法分析 (3)四、流程及程序设计 (5)(1)、流程图 (5)(2)、模块及其功能介绍 (6)五、调试与算法复杂度分析 (7)(1)、运⾏结果 (7)(2)、H ANOI塔问题复杂度分析 (9)总结 (10)参考⽂献 (11)附录 (12)摘要汉诺威塔是⼀款集娱乐与运算的智⼒游戏,它不仅能使⼈在休闲的时候放松⼼情,⽽且还能在玩的过程中不断的提⾼你的思维能⼒。

有三个柱⼦A, B, C。

A柱⼦上叠放有n个盘⼦,每个盘⼦都⽐它下⾯的盘⼦要⼩⼀点,可以从上到下⽤1, 2, ..., n编号。

要求借助柱⼦C,把柱⼦A上的所有的盘⼦移动到柱⼦B上。

移动条件为:1、⼀次只能移⼀个盘⼦2、移动过程中⼤盘⼦不能放在⼩盘⼦上,只能⼩盘⼦放在⼤盘⼦上本⽂的主要算法是利⽤函数的递归调⽤算法。

⾸先,想办法将A座上的前n-1个盘借助C座移动到B座上,然后将A组上的第n个盘移动到C座上。

然后再将B座上的n-1个盘借助A座移动到C座上,此次移动也和第⼀次移动⼀样,重复递归,直到最后⼀个盘为⽌。

关键词:汉诺塔递归思想函数调⽤数组指针⼀、背景知识汉诺塔(⼜称河内塔)问题来⾃中东地区⼀个古⽼的传说:在世界刚被创建的时候有⼀座钻⽯宝塔(塔A),其上有64个⾦碟。

所有碟⼦按从⼤到⼩的次序从塔底堆放⾄塔顶。

紧挨着这座塔有另外两个钻⽯宝塔(塔B和塔C)。

从世界创始之⽇起,婆罗门的牧师们就⼀直在试图把塔A上的碟⼦移动到塔C上去,其间借助于塔B 的帮助。

每次只能移动⼀个碟⼦,任何时候都不能把⼀个碟⼦放在⽐它⼩的碟⼦上⾯。

当牧师们完成任务时,世界末⽇也就到了。

19世纪的法国⼤数学家鲁卡曾经研究过这个问题,他正确地指出,要完成这个任务,僧侣们搬动⾦盘的总次数(把1个⾦盘从某个塔柱转移到另1个塔柱叫做1次)为:18,446,744,073,709,551,615次。

假设僧侣们个个⾝强⼒壮,每天24⼩时不知疲倦地不停⼯作,⽽且动作敏捷快速,1秒钟就能移动1个⾦盘,那么,完成这个任务也得花5800亿年!⼆、问题重述有三个柱⼦A, B, C。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录目录 (1)摘要 (2)一、背景知识 (3)二、问题重述 (3)三、算法分析 (3)四、流程及程序设计 (5)(1)、流程图 (5)(2)、模块及其功能介绍 (6)五、调试与算法复杂度分析 (7)(1)、运行结果 (7)(2)、H ANOI塔问题复杂度分析 (9)总结 (10)参考文献 (11)附录 (12)摘要汉诺威塔是一款集娱乐与运算的智力游戏,它不仅能使人在休闲的时候放松心情,而且还能在玩的过程中不断的提高你的思维能力。

有三个柱子A, B, C。

A柱子上叠放有n个盘子,每个盘子都比它下面的盘子要小一点,可以从上到下用1, 2, ..., n编号。

要求借助柱子C,把柱子A上的所有的盘子移动到柱子B上。

移动条件为:1、一次只能移一个盘子2、移动过程中大盘子不能放在小盘子上,只能小盘子放在大盘子上本文的主要算法是利用函数的递归调用算法。

首先,想办法将A座上的前n-1个盘借助C座移动到B座上,然后将A组上的第n个盘移动到C座上。

然后再将B座上的n-1个盘借助A座移动到C座上,此次移动也和第一次移动一样,重复递归,直到最后一个盘为止。

关键词:汉诺塔递归思想函数调用数组指针一、背景知识汉诺塔(又称河内塔)问题来自中东地区一个古老的传说:在世界刚被创建的时候有一座钻石宝塔(塔A),其上有64个金碟。

所有碟子按从大到小的次序从塔底堆放至塔顶。

紧挨着这座塔有另外两个钻石宝塔(塔B和塔C)。

从世界创始之日起,婆罗门的牧师们就一直在试图把塔A上的碟子移动到塔C上去,其间借助于塔B的帮助。

每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。

当牧师们完成任务时,世界末日也就到了。

19世纪的法国大数学家鲁卡曾经研究过这个问题,他正确地指出,要完成这个任务,僧侣们搬动金盘的总次数(把1个金盘从某个塔柱转移到另1个塔柱叫做1次)为:18,446,744,073,709,551,615次。

假设僧侣们个个身强力壮,每天24小时不知疲倦地不停工作,而且动作敏捷快速,1秒钟就能移动1个金盘,那么,完成这个任务也得花5800亿年!二、问题重述有三个柱子A, B, C。

A柱子上叠放有n个盘子,每个盘子都比它下面的盘子要小一点,可以从上到下用1, 2, ..., n编号。

要求借助柱子C,把柱子A上的所有的盘子移动到柱子B上。

移动条件为:1、一次只能移一个盘子;2、移动过程中大盘子不能放在小盘子上,只能小盘子放在大盘子上。

用计算机算法思想解决该问题,利用C++实现其动态演示。

三、算法分析设A上有n个盘子。

当n=1时,则将圆盘从A直接移动到C。

当n大于等于2时,移动的过程可分解为三个步骤:第一步把A上的n-i个圆盘移到B上;第二步把A上的一个圆盘移到C上;第三步把B上的n-i个圆盘移到C上;其中第一步和第三步是类同的。

为了更清楚地描述算法,用图示法描述如下:将N个盘子从A杆上借助C杆移动到B杆上。

这样移动N个盘子的工作就可以按照以下过程进行:①第一次调用递归②将一个盘子从A移动到B上;③第二次调用递归重复以上过程,直到将全部的盘子移动到位时为止。

由递归算法我们可以得到递推关系:M(n)=2M(n-1)+1 当n>1时M(n)=1 当n=1时四、流程及程序设计(1)、流程图有上述流程图得出实现递归函数过程的流程图设计如下图所示:(2)、模块及其功能介绍首先定义两个类: Tower类(栈)Hanoi类(包含三个Tower类对象组成),程序中大部份功能函数封装在这两个类中(包括:递归算法Hanoi::Move()、图形显示函数Hanoi::Outlin()、移动演示函数Hanoi::MoveShow() 等)塔的盘子是字符串由('=',' ')组成的另外还有一些函数:Push函数的功能是放入盘子, pop函数的功能是取出盘子重要函数的分析:void Move(int n,int A,int B,int C)递归(这里的A,B,C是相对的,不等同外面定义的A塔,B塔,C塔){if(n==1)//递归的终止条件{move(A,C);//将A塔上的最后一个盘子盘子直接移动到C塔}else{Move(n-1,A,C,B);//将A塔上的n-1个盘子通过C塔移动到B塔move(A,C);//将A塔上的最后一个盘子盘子直接移动到C塔 Move(n-1,B,A,C);//将B塔上的n-1个盘子通过A塔移动到C塔}}五、调试与算法复杂度分析(1)、运行结果(以4层Hanoi塔为类)运行程序得到如下界面:程序主界面游戏的初始状态当完成第一步时,A上第一个盘就移动到B上这时按任意键继续。

如下:第一步结束时状态第二步结束时状态︰︰︰第十五步结束的状态最后就完成了将A上所有的盘子移动到C盘上。

(2)、Hanoi塔问题复杂度分析①时间复杂度程序所花时间正比于所输出的信息行数目,而信息行的数目则等价于盘子的移动次数。

考察程序,设盘子移动次数为moves(n),用迭代方法计算公式,得到结果moves(n)=2n-1。

因此,hanoi函数的时间复杂度为O(2 n) 。

② 空间复杂度从每个塔上移走盘子时是按照LIFO进行,因此可以把每个塔表示成一个堆栈。

3座塔在任何时候总共拥有的盘子都是n个。

如果使用链表形式的堆栈,只需申请n个元素所需要的空间。

如果使用的是基于公式化描述的堆栈,塔1和塔2的容量都必须是n,而塔3的容量是n-1,因此所需要的空间总数为3n-1。

Hanoi塔问题的复杂性是以n为指数的函数,因此在可以接受的范围内,只能解决n值比较小(n<=30)的hanoi问题。

对于这个较小的n值,堆栈在空间需求上的差别相当小,可以随意使用。

总结计算机算法设计与分析和现代计算机技术的实际应用相结合,是我在本阶段学完理论课程之后对自己该方面的能力的一次很好的检验,从开始的算法思路到运行调试后的美观的运行结果界面以及另人兴奋的可用程序,都是一个很好的学习和锻炼的过程。

使我们巩固了原有的理论知识,培养了我灵活运用和组合集成所学过知识及技能来分析、解决实际问题的能力。

使我体会到自身知识和能力能在实际中的应用和发挥。

通过学习我丰富了计算机操作经验,更增强了对C++语言的使用技巧。

汉诺塔是个不错的数学游戏,由于问题的有趣,所以能很好地提高参与者地热情与兴趣。

现在汉诺塔也被运用于很多智力游戏中,我们在玩手机游戏的时候,也会锻炼一下自己的脑力。

汉诺塔也很好的体现了数学的递归思想。

设计汉诺塔程序,充分了解汉诺塔问题的本质以及怎样移动盘子。

认真看课本的方法,还能对平时上课的内容得到巩固和熟练。

参考文献1 严蔚敏. 数据结构(C语言版). 清华大学出版社. 20072 吴乃陵.,况迎辉. C++程序设计(第2版). 高等教育出版社. 20073 王晓东. 计算机算法设计与分析(第三版). 电子工业出版社. 2007附录#include<iostream>#include<string>using namespace std;#include <stdlib.h>#define MAX 10000struct Stack{string data;Stack *next;};class Tower{int floor;int broad;public:Stack *top;int Top;Tower(int store){ floor=store;if(floor<6)broad=4+2*floor;else broad=2+2*floor;Top=0;string bro;for(int i=0;i<broad/2;i++)bro=bro+"[]";Stack *temp=new Stack;temp->data=bro;temp->next=top;top=temp;}string OutFloor(int i){ Stack *toptemp=top;for(int j=0;j<Top-i;j++)toptemp=toptemp->next;return toptemp->data;}void push(string disc){ Stack *temp=new Stack;temp->data=disc;temp->next=top;top=temp;Top++;}string pop(){ Stack *temp;string x;if(top==NULL) return NULL;else{ x=top->data;temp=top;top=top->next;free(temp);Top--;return x;}}string disc(int space){string dis;for(int i=0;i<space;i++)dis=dis+' ';for(int j=space;i<broad-space;i++)dis=dis+'=';for(int k=broad-space;k<broad;k++)dis=dis+' ';return dis;}};class Hanoi{int Store;int broad;Tower *A;Tower *B;Tower *C;int step;int STEP[MAX];void move(int A,int C){step++;STEP[step]=A*10+C;}void Move(int n,int A,int B,int C){if(n==1)move(A,C);else{Move(n-1,A,C,B);move(A,C);Move(n-1,B,A,C);}}public:Hanoi(int store){Store=store;if(Store<6)broad=4+2*Store;else broad=2+2*Store;A=new Tower(store);for(int i=1;i<=Store;i++)A->push(A->disc(i));B=new Tower(store);C=new Tower(store);step=0;Move(Store,1,2,3);}void OutStep(){int StepTemp;cout<<"\n\t移动方法:"<<endl;for(StepTemp=1;StepTemp<=step;StepTemp++)cout<<"\n\t"<<"第"<<StepTemp<<"步:"<<STEP[StepTemp]/10<<"-->"<<STEP[StepTemp]%10<<"\t";}void Outlin(){int i=Store;string space;for(int j=0;j<broad;j++)space=space+" ";cout<<"\n\n"<<endl;while(i>=0){cout<<"\t";if(A->Top>=i)cout<<A->OutFloor(i);else cout<<space;cout<<"\t";if(B->Top>=i)cout<<B->OutFloor(i);else cout<<space;cout<<"\t";if(C->Top>=i)cout<<C->OutFloor(i);else cout<<space;cout<<"\n";i--;}}void MoveShow(){int Step=1;string ans;Outlin();do{cout<<"\n\t第"<<Step<<"步:"<<STEP[Step]/10<<"-->"<<STEP[Step]%10<<endl;switch(STEP[Step]){case 12: B->push(A->pop());break;case 13: C->push(A->pop());break;case 21: A->push(B->pop());break;case 23: C->push(B->pop());break;case 31: A->push(C->pop());break;case 32: B->push(C->pop());}Outlin();if(Step<step)system("pause");Step++;}while(Step<=step);cout<<"\n 演示完毕!(输入任意字符退出)\n\n";cin>>ans;}void GameMove(){int from,go;Outlin();do{cout<<"\n\t请输入移动哪个塔(1,2,3):";cin>>from;while(from>3||from<1){cout<<"-_-!";cin>>from;}cout<<"\n\t请输入移到哪个塔(1,2,3):";cin>>go;while(go>3||go<1||go==from){cout<<"-_-!";cin>>go;}int temp=from*10+go;switch(temp){case 12:if(A->top->data<B->top->data)B->push(A->pop()); else cout<<"ERROR!";break;case 13:if(A->top->data<C->top->data)C->push(A->pop());else cout<<"ERROR!";break;case 21:if(B->top->data<A->top->data)A->push(B->pop());else cout<<"ERROR!";break;case 23:if(B->top->data<C->top->data)C->push(B->pop());else cout<<"ERROR!";break;case 31:if(C->top->data<A->top->data)A->push(C->pop());else cout<<"ERROR!";break;case 32:if(C->top->data<B->top->data)B->push(C->pop());else cout<<"ERROR!";}Outlin();}while(C->Top!=Store);cout<<"你太强了!!\n"<<endl;system("pause");}};void Arithmetic();Hanoi *hanoi;void main(){int cord1,cord2;do{system("cls");cout<<"\n\n\n\t\t\t 汉诺塔问题的动态演示\n";cout<<"\t\t\t -------------------08调查分析周丽存(20080403143)\n";cout<<"\n\t\t\t 1.建立汉诺塔\n";cout<<"\n\t\t\t 2.算法思想\n";cout<<"\n\t\t\t 3.结束程序\n";cout<<"\t\t\t ------------------- \n";cout<<"\t\t\t 请输入你的选择(1,2,3):";cin>>cord1;while(cord1>3||cord1<1){cout<<"-_-!";cin>>cord1;}switch(cord1){case 1:int ans;cout<<"\n\t\t\t 请输入层数(1-10):";cin>>ans;if(ans<1) ans=1;if(ans>10) ans=10;hanoi=new Hanoi(ans);hanoi->Outlin();cout<<"\n"<<endl;system("pause");do{system("cls");cout<<"\n\n\n\t\t\t 汉诺塔\n";cout<<"\n\t\t\t 1.开始演示\n";cout<<"\n\t\t\t 2.输出步骤\n";cout<<"\n\t\t\t 3.游戏模式\n";cout<<"\n\t\t\t 4.返回主菜单\n";cout<<"\n\t\t\t 5.终止程序\n";cout<<"\t\t\t -------------------\n";cout<<"\t\t\t 请输入你的选择(1,2,3,4,5):";cin>>cord2;while(cord2>5||cord2<1){cout<<"-_-!";cin>>cord2;}switch(cord2){case 1:system("cls");hanoi->MoveShow();delete hanoi;hanoi=new Hanoi(ans);break;case 2:system("cls");hanoi->OutStep();cout<<"\n"<<endl;system("pause");break;case 3:system("cls");hanoi->GameMove();delete hanoi;hanoi=new Hanoi(ans);break;case 4:break;case 5:exit(0);}}while(cord2<=5&&cord2!=4);delete hanoi;break;case 2:system("cls");Arithmetic();break;case 3:exit(0);}}while(cord1<=3);return;}void Arithmetic(){string ans;cout<<"\n\n";cout<<" 把N层塔看做两部份:N-1,1(如图所示) ==== | | "<<endl;cout<<" ====== n-1 n "<<endl;cout<<" ======== | | "<<endl;cout<<" ========== | "<<endl;cout<<""<<endl<<endl;cout<<" 1.把N-1部份移到B塔:"<<endl;cout<<" A B C "<<endl;cout<<" ==== "<<endl;cout<<" ====== "<<endl;cout<<" ========== ======== "<<endl;cout<<" [][][][][][] [][][][][][] [][][][][][] "<<endl<<endl<<endl;cout<<" 2.把最后一部份移到C塔:"<<endl;cout<<" A B C "<<endl;cout<<" ==== "<<endl;cout<<" ====== "<<endl;cout<<" ======== ========== "<<endl;cout<<" [][][][][][] [][][][][][] [][][][][][] "<<endl<<endl;cout<<" 3.把N-1部份移到C塔:"<<endl;cout<<" A B C "<<endl;cout<<" ==== "<<endl;cout<<" ====== "<<endl;cout<<" ======== "<<endl;cout<<" ========== "<<endl;cout<<" [][][][][][] [][][][][][] [][][][][][] "<<endl<<endl;cout<<" 4.下面要做的就是通过1,2,3步结合递归思想,再分解N-1部分,直至N=1最简情况"<<endl<<endl;cout<<" 补充:汉诺塔的实质是栈都具有先进后出的性质!!"<<endl<<endl;cout<<"输入任意字符退出";cin>>ans;}。

相关文档
最新文档