汉诺塔Python
刚开始看python实现汉诺塔,自己想了很久才想明白,在这里记录一下,希望以后忘记能够立马记起。
n=1时,可以直接a->c
n=2时,可以借助b然后将a->c
n=3时,可以将最上面的那两个作为一个整体先移动到b,然后把最下面的移动到c,再把上面两个移动到c,那上面两个具体怎么移动呢,不就是n=2的时候那样子移动吗?只不过这时候上面两个的目标就是b,所以需要借助c移动到b,再移动完最下面的那时候,目标就又变为了从b移动到c,而需要借助的是a。
再往上就同理,始终将最底下的上面作为一个整体,这n-1个先移到不用的柱子上,再移动最下面的,这时候最下面的那个就不用考虑了,只需要去考虑n-1个,所以目标就变为将n-1个从b移动到c,这时候就先把n-2个移动到a,然后再移动最下面的到c,然后就可以只管n-2个了。依次类推。
def move(n, a, b, c):
if n ==1:
print a, '-->', c
return
move(n-1, a, c, b)
print a, '-->', c
move(n-1, b, a, c)
move(2, 'A', 'B', 'C')
来看以上代码,看n=2的时候,第一次调用move,这时候依次把实参ABC赋值给形参abc,第一个if不满足,所以到第五行第二次调用move,这时候其实就是move(2, 'A', 'C', 'B'),把实参ACB依次赋值给形参abc,这时候满足if了,将a移动到c,其实就是将A移动到B,也就是我们需要借助的柱子,和上面分析的一样,然后这个函数返回空值,第二次调用就结束了,(return后整个函数就执行完了)这时候就得执行第一次第五行之后的了,也就是将a移到c,但是注意这时候的形参ac分别指的是第一次传进来的实参,也就是A移到C,然后执行最后一行,再次调用move,这时候将BAC传给了abc,然后调用move,满足if,a移动到c,也就是B移动到C。这是整个过程。
n=3 的过程底下已经给出。
从宏观上看,可以将括号里的第123个形参分别看作是现在的位置,借助的柱子,目标柱子。代码2.3行就是在说如果是一个的时候直接从现在位置移动到目标位置就行了。然后如果不是,就将n-1由a借助c去移动到b,然后再将a移动c,然后再将b上的n-1个借助a移动到c。