关于python递归函数实现汉诺塔

admin_account 发布于 2015/11/26 21:22
阅读 1K+
收藏 0
def move(n,a,b,c):              #1
    if n==1:                    #2
        print(a,'-->',c)        #3
    else:                       #4
        move(n-1,a,c,b)         #5
        move(1,a,b,c)           #6
        move(n-1,b,a,c)         #7

print(move(3,'A','B','C'))      #8
以上是我从网上看到的实现方法,有几个地方不太明白,求解答,非常感谢~
假如n=3,执行move的时候会运行到#5,#5执行完了以后的结果是move(2,a,c,b),然后是又跳回到#1重新执行,讲n-1传递给n,a传递给a,c传递给b,b传递给c,如果我的a,b,c的值为X,Y,Z的话,那重新执行的也就是move(2,X,Z,Y),然后继续执行到#5,又重新调用自身,这个时候是不是就变成了move(1,X,Y,Z)了?然后匹配了if的条件,输出了X-->Z吗?输出了#3以后,再往下是怎么执行的,直接执行#6了吗?好像也不对呀,#6是的n=1,那不是直接有输出了X-->Z吗?
有点糊涂了,小弟初学python,以前也没编程基础,网上看了其他资料和视频,还找了汉诺塔游戏玩了下,最终还是没看明白,天资愚钝,希望各位能帮助下小弟,在此谢过!
越详细越好。

经过这几天自己琢磨勉强看懂了一些,但是还是感觉太抽象了。

请问为什么move(n-1,a,c,b)代表把n-1个盘子从a借助c移动到b啊,move是我定义函数的名字,感觉没什么道理呀!
还有python的递归函数在调用自身很多层的时候,在什么情况下才认为一层的调用结束了呀,是有return返回?还是有print输出?有print的输出的时候是否会继续往下执行?还是退回到上一层?
真心想弄明白,我看网上很多人都是只是说,把所有盘子的移动看成三步,先把n-1借助C移动到B,再将n从A移动到C,再把n-1从B移动到C,这个道理我也能勉强想明白,但是代码的实现就真的无法理解了呀!

加载中
0
fys
fys
算法:当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上。
            当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C塔上。
            当A塔上有3个盘子时,先将A塔上编号1至2的盘子(共2个)移动到B塔上(需借助C塔),然后将A塔上的3号最大的盘子移动到C塔,最后将B塔上的两个盘子借助A塔移动到C塔上。
           当A塔上有n个盘子是,先将A塔上编号1至n-1的盘子(共n-1个)移动到B塔上(借助C塔),然后将A塔上最大的n号盘子移动到C塔上,最后将B塔上的n-1个盘子借助A塔移动到C塔上。
          综上所述,除了只有一个盘子时不需要借助其他塔外,其余情况均一样(只是事件的复杂程度不一样)。
0
fys
fys
http://baike.baidu.com/link?url=wtr2XXi7-JMaczMsfXulirSy5J09PWYMESTSmW77wzW1dtHmGuyXkIy0rv5HJH6MGapnjToWeJjj_9T3e5t-4q
返回顶部
顶部