交作业~这次的题目有点费神!~,,Ծ‸Ծ,,
Topic source看了这篇博文瞬间明白为什么能打印出来b-->了!!!
move(n-1,a,c,b)
print(a,'-->',c)
move(n-1,b,a,c)
到这里的时候注意,第一步,b到了c的位置,也就是说本来看起来是打印a-->c的,变成了a-->b,然后继续move,b到了a的位置,后续打印就是b-->a 大家看我说的对不对ˋ( ° ▽、° )
按照我的程序写的3层汉诺塔的详细打印流程,希望能帮助大家理解(反正我自己画完就懂了= ̄ω ̄=)
move(3,'A','B','C')
move(2,'A','C','B')
move(1,'A','B','C')
print('A','-->','C') #1.A-->C
print('A','-->','B') #2.A-->B
move(1,'C','A','B')
print('C','-->','B') #3.C-->B
print('A','-->','C') #4.A-->C
move(2,'B','A','C')
move(1,'B','C','A')
print('B','-->','C') #5.B-->A
print('B','-->','C') #6.B-->C
move(1,'A','B','C')
print('A','-->','C') #7.A-->C
回楼上……啊啊啊我打错了!!好吧,感谢纠正!
话说我自己提的那个傻缺问题,学到后面我想明白了,因为函数是要有返回值的,如果没有return的话就会自动返回None,所以不想有None的话就自己设定一个返回值
这个过程我是这么理解的: 首先我们定义的函数:move(n, a, b, c)表示将a柱上的n个‘盘子’(姑且这么称呼)借助b柱搬运到c柱上,这样我们处理的时候不考虑具体搬运过程,思路是先将a柱上的n-1个盘子借助c柱搬运到b柱上,所以有move(n-1, a, c, b);然后将a柱上仅剩的1个盘子借助b柱搬运到c柱上,所以有move(1, a, b, c);最后将b柱上的n-1个盘子借助a柱搬运到c柱上,所以有move(n-1, b, a, c)。 函数中参数a表示待搬运的盘子放置的柱子,参数b表示用于中转盘子的柱子,参数c表示盘子最终需要搬到的柱子。
- 1
我会掏鸟蛋啊
移动的流程我是完全想明白了的: 1个盘子,起始柱-->终点柱,移动一次; 2个盘子,起始柱-->临时柱,起始柱-->终点柱,临时柱-->终点柱,移动3次; 3个盘子,先把上面的2个盘子移到临时柱,再把下面的盘子移到终点柱,剩下的操作就是把2个盘子移动到终点柱…… 也就是说N个盘子,先把N-1个盘子移到临时柱,这时把第N个盘子移到终点柱,再把那N-1个盘子移到终点柱就行了,移动次数就是f(N)=2f(N-1)+1 然而在实现的时候就完全懵逼了…… 参考了下大家的答案,自己稍微改了改,不是很明白为什么有4个参数,明明要输入的只有1个数,感觉3根柱子应该是常数啊……最开始也不懂为什么最后打印的move里面字母要打引号,于是我把最后的字母改成中文,这样就能理解了,只是个代号而已,这柱子可以叫任何名字…… 递归函数里面加上return w也是个人习惯,因为不知道为什么不加的话每次都会在最后出现一个None,不是很喜欢这种显示。。 最后正如有人问的那样,我也不懂为什么明明只打印了a-->c,却能看到b的各种移动啊……求解 ≡(▔﹏▔)≡