- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
汉诺塔的问题:(百度百科引用)
汉诺塔问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
或许下面的解释会好理解一些:
现在要求庙里的老和尚把这64个盘子全部移动到第三个柱子上。移动的时候始终只能小盘子压着大盘子。
1、此时老和尚(后面我们叫他第1个和尚)觉得很难,所以他想:要是有一个人能把前63个盘子先移动到第二个柱子上,我再把最后一个盘子直接移动到第三个柱子,再让那个人把刚才的前63个盘子从第二个柱子上移动到第三个柱子上,我的任务就完成了,简单。所以他找了比他年轻的和尚(后面我们叫他第2个和尚)(呵呵,倚老卖老),命令:
????????①?你把前63个盘子移动到第二柱子上
????????②?在我自己把第64个盘子一道第三个柱子上后
????????③?你把前63个盘子移动到第三柱子上
2、第2个和尚接了任务,也觉得很难,所以他也和第1个和尚一样想:要是有一个人能把前62个盘子先移动到第三个柱子上,我再把最后一个盘子直接移动到第二个柱子,再让那个人把刚才的前62个盘子从第三个柱子上移动到第三个柱子上,我的任务就完成了,简单。所以他也找了比他年轻的和尚(后面我们叫他第3和尚)(呵呵,又倚老卖老),命令:
①?你把前62个盘子移动到第三柱子上
????????②?在我自己把第63个盘子一道第二个柱子上后
????????③?你把前62个盘子移动到第二柱子上
3、第3个和尚接了任务,又把移动前61个盘子的任务依葫芦话瓢的交给了第4个和尚,等等递推下去,直到把任务交给了第64个和尚为止(估计第64个和尚很郁闷,没机会也命令下别人,因为到他这里盘子已经只有一个了)。
4、到此任务下交完成,到各司其职完成的时候了。
?
完成回推了:
第64个和尚移动第1个盘子,把它移开,然后第63个和尚移动他给自己分
?
?
配的第2个盘子。第64个和尚再把第1个盘子移动到第2个盘子上。到这里第64个和尚的任务完成,第63个和尚完成了第62个和尚交给他的任务的第一步。
从上面可以看出,只有第64个和尚的任务完成了,第63个和尚的任务才能完成,只有第2个和尚—第64个和尚的任务完成后,第1个和尚的任务才能完成。这是一个典型的递归问题。
?
现在我们以有3个盘子来分析:
?
第1个和尚命令:
?㈠?第2个和尚你先把第一柱子前2个盘子移动到第二柱子。(借助第三个柱子)
㈡第1个和尚我自己把第一柱子最后的盘子移动到第三柱子。
㈢第2个和尚你把前2个盘子从第二柱子移动到第三柱子。
很显然,第㈡步很容易实现(哎,人总是自私地,把简单留给自己,困难的给别人)
?????其中第㈠步。第2个和尚他有2个盘子,他就命令:
???????①?第3个和尚你把第一柱子第1个盘子移动到第三柱子。(借助第二柱子)
???????②?第2个和尚我自己把第一柱子第2个盘子移动到第二柱子上。
???????③?第3个和尚你把第1个盘子从第三柱子移动到第二柱子。
同样,第步很容易实现,但第3个和尚他只需要移动1个盘子,所以他也不用在下派任务了。(注意:这就是停止递归的条件,也叫边界值)
?????第㈢步可以分解为,第2个和尚还是有2个盘子,命令:
??????①第3个和尚你把第二柱子上的第1个盘子移动到第一柱子。
??????②?第2个和尚我把第2个盘子从第二柱子移动到第三柱子。
??????③第3个和尚你把第一柱子上的盘子移动到第三柱子。
?分析组合起来就是:1→3???1→2????3→2????1→3???2→1??2→3???1→3共需要七步。如果是4个盘子,则第一个和尚的命令中第1步和第3步各有3个盘子,所以各需要7步,共14步,再加上第1个和尚的1步,所以4个盘子总共需要移动7+1+7=15步,同样,5个盘子需要15+1+15=31步,6个盘子需要31+1+31=64步……由此可以知道,移动n个盘子需要(2的n次方)--1步。
?
从上面整体综合分析可知把n个盘子从1座(相当第一柱子)移到3座(相当第三柱子):
??(1)把1座上(n-1)个盘子借助3座移到2座。
??(2)把1座上第n个盘子移动3座。
??(3)把2座上(n-1)个盘子借助1座移动3座。
?
下面用hanoi(n,a,b,c)表示把1座n个盘子借助2座移动到3座。
很明显,(1)步上是?hanoi(n-1,1,3,2)
????????(2)步上是hanoi(n-1,2,1,3)
下面是实现代码:
[cpp]?\oviewplainviewplain?\ocopy
文档评论(0)