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

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


asdhjhg
浏览 2064回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python