最近在学廖雪峰老师的Python入门课程,到了递归这一节,汉诺塔的递归算法让我很是困惑,拜读了一些前人的文章后终于开了窍,总结如下,也算是把自己的所思所想梳理一遍。
递归的组成有两部分,一个是递归体,一个是递归结束条件。其本质在于重复,因此找到了重复的内容就能推导出递归体。
以汉诺塔为例,将三个柱子(初始柱,过渡柱,目标柱)分别标记为A,B,C,(注:这里的柱子相当于实参,字母相当于形参)这个搬圆盘活动抽象后可分成三步:
1.将初始柱上除最下面的圆盘以外的圆盘全部搬到过渡柱上;
2.将初始柱上最下面的圆盘搬到目标柱上;
3.将过渡柱上的圆盘全部搬到目标柱上。这一步也可以看做是第一步的逆向操作。
一切搬圆盘都是在重复上面三个步骤,因此,这三步便是一个递归体。下面将代码表示出来:
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)
举例来说(可以画图理解),当A柱上有n个圆盘时,首先要把A上的(n-1)个圆盘放到B柱上,代码如下:
move (n-1,a,c,b)
这样就可以把A上最下面的圆盘放在C上。
print a,'-->',c
然后再将(n-1)个圆盘从B移动到C上。
move (n-1,b,a,c)
那么这(n-1)个圆盘的移动也是一次递归过程,这次递归所要做的是把(n-2)个圆盘先从A柱移动到C柱上,然后把‘第’(n-1)个圆盘移动到B柱上,再将C柱上的(n-2)个圆盘移动到B柱上,(注:这次的移动过程中,A柱为初始柱,C柱为过渡柱,B柱为目标柱。)
由此可以看出,这是一个不断重复的过程。需要注意的是不要被形参的变化搞糊涂了。当move (n-1,a,c,b)循环到n为1时,输出结果,结束循环,然后开始move (n-1,b,a,c)的循环,直至结束。由此整个汉诺塔移动完成。
参考文章
http://www.cnblogs.com/mzcletics/p/5901784.html
http://m.blog.csdn.net/article/details?id=44620867
http://blog.csdn.net/hikobe8/article/details/50479669