首页 > 其他 > 详细

递归之汉诺塔问题

时间:2015-04-22 22:15:19      阅读:236      评论:0      收藏:0      [点我收藏+]

有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:

  1. 每次只能移动一个圆盘;
  2. 大盘不能叠在小盘上面。

提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。

问:如何移?最少要移动多少次?

这个问题也就是著名的汉诺塔问题,以上对问题的描述摘于维基百科(因为懒,所以不手打了),对于这个问题的详细描述请点击一下维基百科的页面

对于这个问题,刚开始确实不太好理解,不过我们可以从三个圆盘开始,最简单的方法就是拿扑克牌自己模拟以下,反正我是这么做的,感觉效果还是很不错的。

其主要的思想就是递归,将问题一步一步化解为base case。

主要步骤:

1》 用C柱做过渡,将A柱上的(n - 1)个盘子移到B柱上。

2》 将A柱上的最后一个盘子直接移到C柱上。

3》 用A柱做过渡,将B柱上的(n - 1)个盘子移到C柱上。


其中要注意的几点,如果盘子只有三四个,我们可以手动实现移动的过程。但是盘子一旦超过5个,其递归的层数就相对很深了,我们就要把这个问题交给计算机了。每当把最后一个大盘子移到C柱上,这个问题就相对化简了一次,问题的规模也变成了n - 1,然后一直递归,最后就成了1。

下面用Python实现的代码:

def printMove(fr, to):
    print('move from ' + str(fr) + ' to ' + str(to))

# n for numbers, fr for A, to for C, spare for B
def Towers(n, fr, to, spare):
    if n == 1:
        printMove(fr, to)
    else:
        Towers(n-1, fr, spare, to)
        Towers(1, fr, to, spare)
        Towers(n-1, spare, to, fr)


递归之汉诺塔问题

原文:http://blog.csdn.net/wzqnls/article/details/45200307

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!