汉诺塔游戏中的递归算法

来源:互联网 发布:数据库中的模式是 编辑:程序博客网 时间:2024/04/29 16:09

算法的学习:递归 汉诺塔游戏
首先,把上层和底座视作两个部分(简称 上,下)
这里写图片描述

整体移动至C柱可视为两个步骤:
1,‘上’移动至B
2,‘下’移动至C
3,‘上’移动至C
 把A上的最大盘移动到C盘,移动后的状态:
中间状态:  A:空的。B:n-1个盘子。C:有一个最大盘(第n个盘子)
  要注意的一点是:这时候的C柱其实可以看做是空的。因为此时C柱上的圆盘不需要再移动,剩下的所有盘子都比它小,它们中的任何一个都可以放在上面,也就是C柱上。
  所以现在三个柱子的状态:
中间状态:  A:空的。B:n-1个盘子。C:空的
当你搞清楚上面的状态时,这个问题就解决了一半了

由于‘上’是n-1个圆盘的组合,我们发现,步骤1和步骤3最为复杂,必然要借助另外一根柱子完成转移,不妨称之为工具柱
此时定义一个函数 move可以完成要:”借助另外一根柱子完成转移“的动作
函数的形式为 move(‘上’,原柱子,工具柱,目标柱子)
此时步骤为:
1,A(原柱)的‘上’,通过C(工具柱)移动至B(目标柱) move(n-1,A,C,B)
状态 A:第n个盘子。 B:有序的n-1个盘子。 C:空的
2,A的‘下’,移动至C A–>C
3,B(原柱)的‘上’,通过A(工具柱)移动至C(目标柱) move(n-1,B,A,C)
状态: A:空的。 B:有序的n-1个盘子。 C:第n盘子(可看为空柱)

这三步实现的动作是: 圆盘在(原柱),通过(工具柱),移动至(目标柱)
此时的问题变成了将B柱的n-1个盘子移动至C ,如果你做了这个动作,很好,我们完美的完成了一次递归。

python代码奉上:

def move(n, a, b, c):    if n==1:        return a,'-->',c    move(n-1,a,c,b)    print a,'-->',c    move(n-1,b,a,c)move(3, 'A', 'B', 'C')
0 0