码迷,mamicode.com
首页 > 其他好文 > 详细

递归之汉诺塔问题

时间:2015-04-22 22:17:42      阅读:144      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!