为了账号安全,请及时绑定邮箱和手机立即绑定

Python汉诺塔问题困惑好久。。。

/ 猿问

Python汉诺塔问题困惑好久。。。

asdhjhg 2017-02-13 22:46:49
def move(n, a, b, c):
    if n==1:
        print a,'-->',c
        return
    else:
        move(n-1,a,c,b)
        print a,'-->',c
        move(n-1,b,a,c)

move(4, 'A', 'B', 'C')


本人小白,这个递归困惑了好久,今天自己回答一下,不知我自己的理解是否正确,请大神们指点!!!

The first----在向上面大神请教之后,我自己仔细研究了这个Python汉诺塔,假设为3个盘子的情况做的解析!其实每一次都是一次循环,当n=3,借助B移动到C,直接移动3个肯定不行,要首先执行A柱上面的2(3-1)个,要把他们移到B上,再把A最后一个大盘子移到C柱,最后把B上的2个移到C,完工,这其实类似于把大象关冰箱要几步一样。

The second----好了,那么首先A上的2个移到B要借助C,这就是(2,A,C,B)即A借助C移到B,那么这2(3-1)个直接移动也不行啊!再继续分解,这2个先移动1个,先把1个(2-1)先移动到C,因为有3个柱子,所以规规矩矩写法(1,A,B,C),到这估计就会产生疑问,代码不是A到C再到B,这怎么(1,A,B,C)?但是实际上,这里A,B,C角色已经互换,这里的A还是那个A,这里的B其实就变成了代码里的C了,这里的C变成代码里的B了,屁屁这么多,这一步的实际操作只是A-->C,所以又有了下面printA-->C,通过这一步这1个盘子已经在C上。

The third----然后,A柱子上还有2个,这时候和上面一样,先移动最上面的1个,自己演示过的肯定知道要放到B位置,这里又要注意了,实际上这里参数又发生角色互换,这里的B已然已经代表了''C'',所以又契合了printA-->C,这个时候还有一步,把刚刚那1个小盘子放到这一步这个盘子上面,这一步其实是(1,C,A,B),实际操作就一步,C-->B,这里已然是角色互换呼应printA-->C。至此,第一大步已完成,2个在B上,第三大步把A最后一个大盘子移到C,printA-->C(其实就是把大象塞进去这一步)。

LAST:剩下的其实就和上面第一大步一样,但注意的是,角色也是全部变了。

综上所述,本人总结,其实所谓的A,B,C命名三个柱子,只是命个名,方便操作,但千万不能形成惯性思维,这里的A,B,C变化多端。为了阐述这些,我做了一个图,画的比较凌乱!我自己看懂,不知道各位看不看懂。。。。

最后请各位大神指出我的错误/不足之处,本人小白,不胜感激!!!


http://img.mukewang.com/58a1c6c000018bbd12800950.jpg


查看完整描述

1 回答

?
啊成啊

说起来我觉着是这样的,相互讨论下。
...
老大老二老三,一起玩套娃娃,老大想把自己这的娃娃套到老三那,得需要一个中间人,老二。
当然,只有一个娃娃时,就不麻烦老二了。
这时,老大手里有n个娃娃,老大想,我把n-1个娃娃先套老二那,再把最后一个套老三那,再让老二把他那n-1个套老三那,不就结了。
但是,怎么把n-1个套老二那呢,老大有点范难,老三过来建议,让我当老二啊,老二当老三去,这问题不就变成,如何将n-1个套老三那了么。
于是
这时,老大手里有n-1个娃娃,老大想,我把n-2个娃娃先套老二那,再把最后一个套老三那,再让老二把他那n-2个套老三那,不就结了。
...
中间省略了一个步骤,不过递归的原理大致也如此,主要是把抽象的参数具象成不变现实意义

hanuo(n,a,b,c)老大通过老二向老三套n个

hanuo(n-1,a,c,b)老大通过老三向老二套n-1个
hanuo(1,a,b,c)老大通过老二向老三套1个
hanuo(n-1,b,a,c)老二通过老大向老三套n-1个
...
套完收工

好像也有点乱,爪机无力,犯困了,抱歉。

查看完整回答
反对 回复 2017-09-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信