- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
汉诺塔问题(递归)
在数学与计算机科学中,递归(recursion)是指一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大减少了程序的代码量。递归的能力在于用有限的语句定义对象的无限集合。一个递归问题可分为递推和回归两个阶段。在递推阶段,把较复杂问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解;在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解。
只有同时满足下面三个条件的问题,才能用递归解决。
(1) 一个问题可以转化为一个与原问题相似的、规模较小的子问题来求解。比如,在n的阶乘的计算中,将n的阶乘的问题转化为n-1的阶乘乘以n,此问题便可解决。
(2) 这个问题与分解之后的子问题,除数据规模不同,求解思路完全一样。比如,n的阶乘问题中,求解n的阶乘的思路,和求解n-1的阶乘的思路是一模一样的。
(3) 存在递归终止条件。
把问题分解为子问题,再把子问题分解为子子问题,一层一层分解下去,不能存在无限循环,这就需要有终止条件。比如,n的阶乘问题中,0或1的阶乘为1,也就是f(1)=1,f(0)=1,这就是递归的终止条件。
递归是很多算法实现的基础,是程序设计中的一种重要思想和机制,如分治、深度优先搜索、动态规划等算法中均用到递归思想。
汉诺塔问题
汉诺(Hanoi)塔问题是一个经典的运用递归方法解决问题的例子。
问题描述:
汉诺塔是一个发源于印度的益智游戏,也叫河内塔。相传它源于印度神话中的大梵天创造的三根金刚柱,一根柱子上叠着上下从小到大64个黄金圆盘。大梵天命令婆罗门将这些圆盘按从小到大的顺序移动到另一根柱子上,其中大圆盘不能放在小圆盘上面。当这64个圆盘移动完的时候,世界就将毁灭。
那么,好多人会问64个圆盘移动到底会花多少时间?古代印度距离现在已经很远,这64个圆盘还没移动完么?我们通过计算看完成这个任务到底要多少时间?计算结果非常恐怖,移动圆盘的次数为2n-1,即18446744073709551615,假设移动一次圆盘用时一秒,一年。那么,18446744073709551615等于584942417355年,即约为5850亿年。目前太阳寿命约为50亿年,太阳的完整寿命大约100亿年。所以,整个人类文明都等不到移动完整圆盘的那一天。很多人对汉诺塔的解法产生了兴趣。从一阶汉诺塔到N阶汉诺塔它们是否有规律性的算法?能否编程输出每一次移动的方法呢?这就是本例要解决的问题。
输入:
输入一个正整数n,表示有n个圆盘在第一根柱子上。
输出:
输出操作序列,格式为move t from x to y。每个操作一行,表示把x柱子上的编号为t的盘片挪到柱子y上。柱子编号为a,b,c,要用最少的操作把所有盘子从a柱子上转移到c柱子上。
输入样例:
3输出样例:
move?1?from?a?to?cmove?2?from?a?to?bmove?1?from?c?to?bmove?3?from?a?to?cmove?1?from?b?to?amove?2?from?b?to?cmove?1?from?a?to?c
解题思路:
实现这个算法,可以简单分为以下三个步骤。
(1) 把第n-1个圆盘由a移到b。
(2) 把第n个圆盘由a移到c。
(3) 把第n-1个圆盘由b移到c。
从这里入手,加上上面数学问题解法的分析,不难发现,移动的步数必为奇数步。
(1) 第二步是把a柱子上剩下的一个盘子移到c柱子上。
(2) 第一步可以看成把a柱子上的n-1个圆盘借助c柱子移到b柱子上。
(3) 第三步可以看成把b上的n-1个圆盘借助a柱子移到c柱子上。
如3阶汉诺塔的移动: A→C,A→B,C→B,A→C,B→A,B→C,A→C。
参考程序:
计算机三级持证人
从事多年企业管理、在团队建设、员工培训、营销提升、组织架构有多自己的经验,希望在这个平台分享及帮助更多的公司或企业!
原创力文档


文档评论(0)