Discuss / Python / 交作业~这次的题目有点费神!~,,Ծ‸Ծ,,

交作业~这次的题目有点费神!~,,Ծ‸Ծ,,

Topic source

移动的流程我是完全想明白了的: 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的各种移动啊……求解 ≡(▔﹏▔)≡

def move(n,a,b,c):
    w='The End'
    if n==1:
        print(a,'-->',c)
    else:
        move(n-1,a,c,b)
        print(a,'-->',c)
        move(n-1,b,a,c)
    return w
n=int(input('请输入汉诺塔的层数:'))
print(move(n,'起始柱','临时柱','目标柱'))

大家可以参考下这篇博文,希望有帮助~! http://blog.csdn.net/hikobe8/article/details/50479669

看了这篇博文瞬间明白为什么能打印出来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

一边掏鸟蛋就一边把代码敲出来了。- -。

print('B','-->','A') #5.B-->A 这一行是不是应该这样啊?

回楼上……啊啊啊我打错了!!好吧,感谢纠正!

话说我自己提的那个傻缺问题,学到后面我想明白了,因为函数是要有返回值的,如果没有return的话就会自动返回None,所以不想有None的话就自己设定一个返回值

不知不觉w

#9 Created at ... [Delete] [Delete and Lock User]

这个过程我是这么理解的: 首先我们定义的函数: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

Reply