美文网首页
汉诺塔——python

汉诺塔——python

作者: suniney | 来源:发表于2017-10-13 14:49 被阅读50次

    汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?

    image.png

    python解决方式

    def move(n,a,b,c):
        if n==1:
            print(a+'-->'+c)
        else :
            move(n-1,a,c,b)
            move(1,a,b,c)
            move(n-1,b,a,c)
    move(3,'A','B','C')
    

    附上我个人理解

    把每个柱子上的圆盘不考虑个数,只分为2部分 
    part1:最底下————1
    part2:除最底下的其他圆盘———— n-1
    不管怎么移动,我们都是先把part2(n-1)从a移到b
    这样才可以把part(1)从a移到c
    最后把part2(-1)从b移到c
    
    当有两个圆盘时
    顺序为
    A->B
    A->C
    B->C
    所以为了print(a+'-->'+c)为以上顺序
    move(1,a,c,b) print 的就是  A->B
    move(1,a,b,c) print 的就是  A->C
    move(1,b,a,c) print 的就是  B->C
    当有3个圆盘时
    顺序为
    A-->C
    A-->B
    C-->B
    A-->C
    B-->A
    B-->C
    A-->C
    move(2,a,c,b)  不print
    move(2,a,c,b)  继续执行 
    move(1,a,b,c)  print 的就是  A->C
    move(1,a,c,b)  print 的就是  A->B
    move(1,c,a, b) print 的就是  C->B
    move(1,a,b,c)  print 的就是  A->C
    move(2,b,a,c)  不print
    move(2,b,a,c)  继续执行 
    move(1,b,c,a)  print 的就是  B->A
    move(1,b,a,c)  print 的就是  B->C
    move(1,a,b,c)  print 的就是  A->C
    

    相关文章

      网友评论

          本文标题:汉诺塔——python

          本文链接:https://www.haomeiwen.com/subject/awuzyxtx.html