汉诺塔论文

合集下载

汉诺塔的感想和收获

汉诺塔的感想和收获

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

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

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

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

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

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

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

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

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

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

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

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

在汉诺塔问题中,我可以将移动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。

汉诺塔论文

汉诺塔论文

摘要:长期以来,人们只熟悉汉诺塔问题的递归算法。

这里我们采用非递归算法解决这个问题,没用到栈和二叉树。

关键字:改变表现,递推关系,时间(空间)复杂度汉诺塔问题:有大小不同的n个盘子和三个柱子。

一开始的时候,所有的盘子都按照大小顺序套在第一根柱子上,最大的盘子在底部,最小的盘子在顶部。

目的是把所有的盘子都移动到第三根柱子上去,在必要的时候可以借助第二根柱子。

我们每次只能移动一个盘子,但不能把较大的盘子放在较小的盘子上面。

我们都知道这个问题的递归算法。

由递归算法我们可以得到递推关系:M(n)=2M(n-1)+1 当n>1时M(n)=1 当n=1时这里的M(n)代表n个盘子所需移动的次数。

我们用反向替换法可以得到:M(n)=2M(n-1)+1=2[2M(n-2)+1]+1=22M(n-2)+2+1=22[M(n-3)+1]+2+1=22M(n-3)+22+2+1经过i次替换后:M(n)=2i M(n-i)+2i-1+2i-2+……+2+1=2i M(n-i)+2i-1因为初始条件是在n=1时确立的,所以令i=n-1,则M(n)=2n-1M(n-(n-1))+2n-1-1=2n-1M(1)+2n-1-1=2n-1因此我们知道对于问题规模为n的问题,时间效率最好为Θ(2n),即我们所得的算法最好也是指数级的。

若用递归会更低效,但我们必须承认递归简洁,易懂。

我们现在手工模拟一下当n=5时的情况。

设源柱子为A,辅助柱子为B,目标柱子我们分析这个表,找到其规律就可以解决汉诺塔问题。

我们称这种方法为“改变表现”。

所谓“改变表现”是指一个问题实例的表现改变为同样实例的另一种表现,它是变治思想的一种类型。

从上面的移动过程中就很容易发现其规律。

我们将上述过程四个分为一组,每一组的前三步移动循环出现且固定不变,而只有每一组中第四步移动改变。

(这个规律只适用于当n为奇数的时候)。

分析:我们用count表示移动的次数,初值为1;当n=1时,A→C。

河内塔实验报告绪论(3篇)

河内塔实验报告绪论(3篇)

第1篇一、引言河内塔实验,又称为汉诺塔问题,是认知心理学中一个经典的实验,起源于古印度的一个传说。

该传说讲述了神勃拉玛在贝拿勒斯的圣庙中留下了一根金刚石的棒,上面套着64个金环,最大的一个在底下,其余的一个比一个小,依次叠上去。

庙里的僧侣们必须将所有的金环从这根棒上移到另一根棒上,规定只能使用中间的一根棒作为帮助,每次只能搬一个圆盘,且大的不能放在小的上面。

当所有的金环全部移完时,就是世界末日到来的时候。

河内塔实验不仅是一个数学问题,更是一个心理学问题,它涉及到人类的问题解决策略、思维过程以及认知能力。

自20世纪50年代认知心理学兴起以来,河内塔实验被广泛应用于心理学、教育学、计算机科学等领域。

本文旨在通过对河内塔实验的综述,探讨其理论背景、实验方法、结果分析以及应用价值,以期为我国心理学研究和教育实践提供有益的借鉴。

二、河内塔实验的理论背景1. 问题解决理论河内塔实验是问题解决理论的一个典型案例。

问题解决是指个体在面对问题时,运用已有的知识和技能,通过一系列的认知活动,找到解决问题的方案。

河内塔实验通过模拟现实生活中的问题解决过程,有助于揭示人类问题解决的心理机制。

2. 认知心理学河内塔实验是认知心理学的一个重要实验,它揭示了人类在解决问题过程中的认知过程。

认知心理学认为,人类解决问题是通过信息加工、记忆、思维等心理过程实现的。

河内塔实验通过观察被试在解决问题过程中的心理活动,有助于了解人类认知能力的局限性。

3. 计算机科学河内塔实验在计算机科学领域也有着广泛的应用。

它为计算机算法的研究提供了启示,有助于设计出更高效、更智能的计算机程序。

三、河内塔实验的方法1. 实验对象河内塔实验的被试通常为不同年龄、性别、教育背景的个体。

实验过程中,要求被试完成从柱子1将所有圆盘移到柱子3的任务。

2. 实验材料河内塔实验的主要材料为三根柱子(柱子1、2、3)和一系列大小不同的圆盘。

圆盘的大小依次递增,构成金字塔状。

玩汉诺塔作文

玩汉诺塔作文

玩汉诺塔作文《玩汉诺塔:一场趣味的挑战我第一次玩汉诺塔,那可真是一段有趣又有点抓狂的经历。

汉诺塔就是那几个圆盘加上三根柱子的小玩意,看起来简单得很,不就把圆盘从一根柱子移到另一根柱子嘛,能有多难呢?我当时就是这么想的。

坐下来准备大显身手。

我把那套汉诺塔摆在桌上,看着那几个大小不一的圆盘,高高地摞在最左边的柱子上,最大的在下面,最小的像个小帽子似的在最顶端。

我记得我开始的时候那叫一个信心满满。

我先伸手拿起最小的圆盘,轻巧地把它放到了中间那根柱子上,心里还想着“这也太容易了吧”。

然后就想着要把第二小的圆盘挪一下位置。

可是这时候问题就来了,我得按照规则移动,不能随便乱放。

就像走迷宫突然遇到死胡同一样,我盯着那几个圆盘看了半天,刚刚轻松的感觉一下子就没了。

每当我觉得自己找到规律的时候,移了几步又发现不对,那些圆盘像是故意跟我作对似的。

我一会儿把这个圆盘挪过来,一会儿又挪回去,桌上的小圆盘让我整得“晕头转向”。

我的眼睛紧紧地盯着那些圆盘,感觉眼珠都快不会转了,眉头也皱得像个小老头。

我还试着用手比划着圆盘运动的轨迹,想把这复杂的移动在脑海里理顺。

玩着玩着,我这急性子就有点按捺不住了。

心里头就像有只小猫在挠一样,但是我知道不能乱,要是乱了顺序那这一轮就彻底失败了。

我深吸一口气,重新开始观察。

发现其实只要沉下心来,从最开始一步一步按规则走,就能慢慢找到节奏。

不能贪心,不是一下子就能把所有圆盘都移好的。

后来我不再那么毛毛躁躁,移动的速度虽然还是有点慢,但是好歹不会乱套了。

每成功地移动一个圆盘,我就感觉像是打了一场小胜仗一样。

直到最后一个圆盘被我稳稳地移到目标柱子上,我心里那股成就感啊,就跟打游戏通关了似的。

这小小的汉诺塔可真不简单,但是战胜它的感觉真的太爽了。

《再玩汉诺塔:熟能生巧的乐趣》自从上次玩了汉诺塔之后,我就对这个小玩意念念不忘。

这不,又找机会开始玩了。

有了上次的经验,这次我可没有一开始就盲目地乱动圆盘。

河内塔实验报告论文

河内塔实验报告论文

摘要河内塔问题,又称为汉诺塔问题,是问题解决领域中的一个经典实验。

本研究旨在通过河内塔实验,探讨被试者在解决问题过程中的思维策略和认知过程。

实验结果表明,被试者在解决问题时,会运用多种策略,如递归、分治等,且口头报告能够促进思维过程的明确化。

本文将从实验设计、结果分析、讨论与结论等方面进行详细阐述。

关键词:河内塔问题;问题解决;思维策略;口头报告一、引言河内塔问题最早由法国数学家Edouard Lucas于1883年提出,该问题要求将一系列圆盘从一个柱子移动到另一个柱子,同时遵守以下规则:1. 每次只能移动一个圆盘;2. 圆盘必须按照从大到小的顺序移动;3. 任何时候,都不能将一个较大的圆盘放在一个较小的圆盘上面。

河内塔问题不仅是一个经典的数学问题,也是一个心理学问题。

在认知心理学领域,河内塔问题被广泛应用于研究问题解决策略和认知过程。

本研究旨在通过河内塔实验,探讨被试者在解决问题过程中的思维策略和认知过程。

二、实验设计1. 被试:选取30名大学生作为被试,男女各半,年龄在18-22岁之间。

2. 实验材料:河内塔问题实验装置,包括三个柱子和一系列大小不同的圆盘。

3. 实验步骤:(1)向被试介绍河内塔问题的规则和目标;(2)让被试独立完成河内塔问题的解决;(3)在被试解决过程中,要求其进行口头报告,描述自己的思考过程;(4)记录被试解决问题的总时间、移动次数以及口头报告的内容。

三、结果分析1. 解决问题总时间:被试解决问题的总时间在60-300秒之间,平均时间为120秒。

2. 移动次数:被试解决问题的移动次数在30-60次之间,平均次数为45次。

3. 口头报告内容:(1)部分被试在解决问题过程中,采用了递归策略。

例如,将被试者A上的n-1个圆盘移动到B上,然后将A上的第n个圆盘移动到C上,最后将B上的n-1个圆盘移动到C上。

(2)部分被试在解决问题过程中,采用了分治策略。

例如,将被试者A上的n-1个圆盘移动到B上,然后将A上的第n个圆盘移动到C上,最后将B上的n-1个圆盘移动到C上。

四年级汉诺塔小论文1000字

四年级汉诺塔小论文1000字

汉诺塔小论文很多天前,王老师通知我们5月份要汉诺塔比赛。

干是,妈妈给我在网上买了一个汉诺塔一开始,我边汉诺塔长什么样都不知道。

我第一眼看见的时候有许多疑问,比如:汉诺塔怎么玩呢?它的员块为什么有大有小呢?后来我看了这个汉诺塔的说明才知道原来是把小的鲁在大的上面。

一开始我是横着玩的,那时我要10分钟才能玩完,直到有一次,星期五晚上我去张逸楷家,他把他的汉诺塔拿了出来,并说:“我和你来比。

"这时我想:我肯定输,不过没关系,失败是成功之母。

张逸楷先来,他的速度很快,我看得眼花缭乱。

我发现张逸楷是竖着玩的,原来竖着玩可以两只手一起开工,所以这样就快了,张逸楷家去了之后,我把他的方法学会了,训练得很认真,就连早上也起得很早,练习20分钟。

时间过得飞快,一眨眼就到了5月份,也迎来了汉诺塔比赛,这时我只要1分40秒左右就可以了。

开始比赛了,裁判居然说不能从旁边开始,要从中间开始;而且下面还不能垫防滑垫,这让我十分恼火,因为王老师明明说可以从旁边开始:下面也可以垫防滑热。

我想:难道干老师故意在为难我们吗?在大家的一致要求下,裁判长同意从旁边开始,这让我十分兴奋棋子放到旁边的时候,大姐姐阻止了我说:“一定要从中间开始。

”我没办法,只好把棋子放到中间。

因为从中间开始我不习惯,所以我2分56秒才玩好,这时我很难过,想没有为班级争光。

下一次还有朗读表演,我一定要把握这个机会。

今天早晨我们比赛了汉诺塔游戏。

我忧心忡忡地走上讲台,面对班里的五名同学,我能否成为擂主呢?我们双手压住汉诺塔前的“计时器”,只听王老师一声令下“开始!”我们迅速把手放到汉诺塔上,给“饼子”搬家。

刚开始,我觉得手紧张的发麻,不听使唤。

比赛过程中,有几次忙乱中饼子没安稳,掉落在外面。

旁边观看的同学都给我加油。

我觉得空气都凝固了,只听见饼子移动的“哗啦”声。

有的同学还在悄声说:“王晶莹,一定赢!”我加快了手下的速度,不敢有丝毫的松懈。

五层、六层、托底、一层、两层……当我挪完最后一颗饼子时,我的同学裁判史睿佳迅速举起手。

汉诺塔作文

汉诺塔作文

汉诺塔作文
一个晴朗的早晨,我在街上散步。

走到了一个十字路口,一
辆公交车向我驶来,我只好等它过去。

这是一辆红色的公交车,
我看见车上有许多人,便挤了上去。

“嗨,请问去什么地方?”一个陌生的声音传了过来。

我抬
头一看,是一个戴着眼镜的叔叔。

我微笑着说:“叔叔,去汉诺
塔吗?”“好啊!”那个叔叔爽快地说。

他在前面带路,我紧跟在
他身后,坐到了汉诺塔的第三层。

汉诺塔的门开了,上来了两个小男孩。

他们一边吃着棒棒糖,一边不停地东张西望。

我好奇地问:“你们在找什么?”其中一
个小男孩说:“我在找一本书!”另一个小男孩说:“我们也要一
本书!”两个男孩争了起来:“你们不是应该看电视吗?怎么还要
看书?”其中一个小男孩说:“那本书是我们的!”
听了他们的对话,我恍然大悟:原来汉诺塔是一座可以让人
变聪明的塔呀!
走出了汉诺塔,我忽然看见不远处有两个人在吵架。

—— 1 —1 —。

汉诺塔游戏作文

汉诺塔游戏作文

汉诺塔游戏作文
“叮铃铃……”上课铃声响了,我们像刚出笼的小鸟飞到教室,老师让我们每人都带一个小盒子。

她给我们每人发一张写着字的纸条,纸条上写着一道题目,她说:“这道题目是:汉诺塔
游戏。

”我一听就知道是“汉诺塔游戏”,因为它是一种纸牌游戏,我猜同学们应该都玩过吧!
老师说:“这道题可真难呀!你们能不能用一个词来形容呢?”我想了想,觉得还是用“疯狂”比较好。

于是,我就叫同学们写一个词。

同学们也纷纷在纸条上写下了自己的答案。

当我看到纸条上的词语是“疯狂”的时候,我高兴极了。

因为我认为用“疯狂”来形容这个游戏再合适不过了。

老师说:“汉诺塔游戏就是通过一个人从起点到终点的距离
来判断一个人是否是冠军,如果你有30米的距离,那你就是冠军;如果你有80米的距离,那你就是亚军;如果你有120米的距离,那你就是季军。

你们看我像哪位选手?”
—— 1 —1 —。

汉诺塔游戏作文

汉诺塔游戏作文

汉诺塔游戏作文
“叮铃铃”,下课铃响了,同学们像一只只出了笼的小鸟,一下子拥到了教室门口。

教室里顿时热闹起来,有的在讨论这节课的游戏;有的在高兴地唱着歌;有的在向对方发起挑战……
游戏开始了,老师让我们先选择一个自己喜欢的游戏。

我选择了汉诺塔。

老师问我们:“同学们,你们知道汉诺塔是什么吗?”“不知道。

”我说。

“对,就是一个人用木头搭一个高塔,然后把它移到目的地,再把木头放回原位。

这个游戏就叫汉诺塔。

”老师说完后,我们又七嘴八舌地议论开了:“有什么好办法吗?我没有办法!”“这可真是个难题啊!”……
我看到其他同学都在认真地思考着游戏规则,而我却傻呆呆地望着天花板,心想:这个游戏太难了!怎么才能做得好呢?如果不能做好怎么办呢?不行,我要向爸爸妈妈请教一下。

于是我去找爸爸妈妈请教。

爸爸妈妈听了后,耐心地给我讲了游戏规则:第一层的积木是在搭高一层的积木;第二层的积木是搭高两层的积木;第三层的积木是搭高三层的积木。

—— 1 —1 —。

汉诺塔比赛作文150

汉诺塔比赛作文150

汉诺塔比赛作文150下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by the editor. I hope that after you download them, they can help yousolve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!In addition, our shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts,other materials and so on, want to know different data formats and writing methods, please pay attention!汉诺塔比赛是一项既具有挑战性又充满趣味的比赛,吸引了众多参赛选手和观众。

汉诺塔递归算法范文

汉诺塔递归算法范文

汉诺塔递归算法范文汉诺塔是一种经典的数学问题,它涉及到递归算法的应用。

汉诺塔问题的描述是:有三个柱子A、B、C,其中A柱上有n个从小到大放置的圆盘,现在要将这n个圆盘按照从小到大的顺序移动到C柱上,并且每次只能移动一个圆盘,且在移动过程中,必须保证大圆盘在小圆盘上面。

那么如何用递归算法解决汉诺塔问题呢?为了更好地理解汉诺塔问题,我们可以将问题简化为只有三个圆盘的情况。

设三个柱子分别为A、B、C,初始时将三个圆盘都放在A柱上,目标是将这三个圆盘从A柱移动到C柱上。

我们可以给每个圆盘编号,编号越小表示圆盘越小。

问题解决的步骤如下:1.将编号为1的圆盘从A柱移动到C柱上;2.将编号为2的圆盘从A柱移动到B柱上;3.将编号为1的圆盘从C柱移动到B柱上;4.将编号为3的圆盘从A柱移动到C柱上;5.将编号为1的圆盘从B柱移动到A柱上;6.将编号为2的圆盘从B柱移动到C柱上;7.将编号为1的圆盘从A柱移动到C柱上。

以上步骤可以总结为以下规律:1)当只有一个圆盘时,直接将它从起始柱移动到目标柱;2)当有两个以上的圆盘时,可以将它们看作两个部分:最底下的圆盘和上面的所有圆盘。

首先将上面的所有圆盘从起始柱移动到中间柱(借助目标柱),然后将最底下的圆盘从起始柱移动到目标柱,最后将上面的所有圆盘从中间柱(借助起始柱)移动到目标柱。

基于以上规律,我们可以得到如下的递归算法实现汉诺塔问题。

```pythondef hanoi(n, start, end, middle):if n == 1:print('Move disk', n, 'from', start, 'to', end)else:hanoi(n-1, start, middle, end)print('Move disk', n, 'from', start, 'to', end)hanoi(n-1, middle, end, start)#测试hanoi(3, 'A', 'C', 'B')```在上述代码中,hanoi函数代表了汉诺塔问题的递归解决方案。

汉诺塔问题解决的认知过程及特点分析

汉诺塔问题解决的认知过程及特点分析

汉诺塔问题解决的认知过程及特点分析摘要以267名大学生为被试,对汉诺塔问题(Tower of Hanoi)解决的认知过程及特点进行了分析。

相对于汉诺塔问题解决较差者(有多余移动步骤的被试)而言,以最少步数解决汉诺塔问题的被试其第一步计划时间较长,但平均计划时间却明显要短。

汉诺塔问题解决较差者多在关键步骤上出错,从而导致多余的移动步数以及总体完成时间的延长。

进一步分析表明,汉诺塔问题解决的这种认知活动主要反映的是与计划和抑制有关的总体计划协调能力以及空间短时记忆能力。

关键词汉诺塔,执行功能,工作记忆,短时记忆。

1前言汉诺塔问题是心理学实验研究常用的任务之一。

该问题的主要材料包括三根高度相同的柱子和一些大小及颜色不同的圆盘,三根柱子分别为起始柱、辅助柱及目标柱。

在起始柱上,圆盘以从大到小的顺序叠放成金字塔形,要求被试尽可能快且以最少步数将这些圆盘移动到目标柱上,而且圆盘的叠放顺序与起始状态相同。

在移动过程中,被试必须遵守三条规则:(1)一次只能移动一个圆盘;(2)任何非当前移动的圆盘必须放置于柱子上。

(3)较大的圆盘不能放在较小的圆盘上。

解决这项任务的最少移动步数为2n-1(其中n为圆盘的数目)。

目前关于汉诺塔问题解决的一个最主要的观点认为,完成汉诺塔任务时要对圆盘的移动顺序进行预先计划和回顾性(retrospective)计划活动[1,2]。

当问题呈现后,在开始第一步的移动之前,大多数被试都会根据设定好的目标状态,对圆盘的移动顺序进行预先计划,以决定圆盘的移动顺序。

但是这种计划能力的作用可能会受到问题难度的影响[2]。

也有研究者[3,4]认为不是计划能力,而是抑制能力参与汉诺塔问题的解决过程。

为了把更大的圆盘先放置于指定位置,必须让较小的圆盘暂时偏离其最终应该放置的位置,但被试的自然反应总是“尽快”将圆盘移动到最终的目的地,如此反而导致错误,使移动步数更多,完成时间更长。

上述关于汉诺塔问题解决过程的争论涉及汉诺塔任务的性质。

  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;}。

相关文档
最新文档