温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

汉诺塔递归算法&分析过程

发布时间:2020-07-08 00:18:07 来源:网络 阅读:1574 作者:lyl无状态 栏目:编程语言

汉诺塔递归算法&分析过程

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

汉诺塔递归算法&分析过程

不管这个传说的可信度有多大,如果考虑一下把64片黄金圆盘,由一根柱子上移到另一根柱子上,并且始终保持上小下大的顺序。这需要多少次移动呢?。1个的时候当然是1次,2个的时候是3次,3个的时候就用了7次......这实在是太累了。这里需要递归的方法。假设有n片,移动次数是f(n).显然

f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2f(k)+1。此后不难证明f(n)=2^n-1。

n=64时,

假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下:

18446744073709551615秒

这表明移完这些黄金圆盘需要5845.54亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。

汉诺塔问题在数学界有很高的研究价值,而且至今还在被一些数学家们所研究,也是我们所喜欢玩的一种益智游戏,它可以帮助开发智力,激发我们的思维。

之前看到了一段经典的递归代码,简简单单几行代码就解决了深奥的问题,为什么那几行代码就把汉诺塔问题给解了呢?

代码如下:

汉诺塔递归算法&分析过程

看到这个程序 ,难理解的就是下面两句:

  move(n-1, a, c, b)

  move(n-1, b, a, c)

我们知道它用了递归,第一句把第一个位置的盘移到第二个位置,第二句再把第二个移到第三个位置。 但为什么这样就可以递归出答案呢?

这个可以用二叉树解释。下面看一个图估计你就会知道了。

汉诺塔递归算法&分析过程

这是一个递归的图解,根结点是第一次进入move函数,第一个参数3只要大于1就往下推,第二个参数是指要移动的盘的原始位置,第四个参数是指要移动到的目的位置,第三个参数中转,下一次递归时准备的一个参数。这个图是按照程序画出来的,上面的节点个数就是调用move函数的次数。现在我们来中序遍历这棵二叉树。

假设:开始时a,b,c三个盘都放在one上,从a到c依次增大,就是说c放在最下面,a在最上面,-> 表示移动。

节点4:a -> z

节点2:b -> y

节点5:a -> y

节点1:c -> z

节点6:a -> x

节点3:b -> z

节点7:a -> z

完成。

假设有4个盘呢?那也是一样的道理可以推出。这时就有15个节点,就是说要移动15次。那有n个盘呢?2的n次方减1……

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

hjk
AI