Discuss / Python / 昨天到今天下午一直在琢磨,怎样这个移动的具体过程体现出来,终于想到了一个办法

昨天到今天下午一直在琢磨,怎样这个移动的具体过程体现出来,终于想到了一个办法

Topic source

花泽的类

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

利用递归函数移动汉诺塔:

-- coding: utf-8 --

def move(n, a, b, c, A, B, C): # 大写字母A、B、C为列表,表示柱子a、b、c里的盘子; B、C可以设默认参数,默认柱子b、c为B=[]、C=[]

if n == 1:
    print('此时 %s为 %s' % (a,A))               # 移动前a中的木块情况
    print('move %s中的%s-->到%s' % (a,A[0],c))  # 将要移动的过程:
                                                # 每次能移走的肯定是
                                                  目前柱子上最上层的盘子;
                                                  每次放盘子的时候也是放在
                                                  柱子的最上层

    C.insert(0,A.pop(0))         # A.pop(0)即移走a中最上层的木块
                                 # C.insert(0, )则表示放入c的最上面

    print('此时 %s为 %s' % (c,C))
    print('\n')

else:   # 递归过程:

    move(n-1, a, c, b, A, C, B)   # 把a中前面n-1个木板假设为是一整块,
                                    借由c移动到b,a只剩最下边一块(第n块)

    move(1, a, b, c, A, B, C)     # 把a中的剩下的最下边的一块木板移动到c

    move(n-1, b, a, c, B, A, C)   # 把b中n-1个木板假设为是一整块,
                                    借由a移动到c

move(3, 'a', 'b', 'c', list(range(1,3+1)), [], []) # (range(1,n+1),根据输入n的值,生成一个[1,2,...,n]的数列。

                                                # 数字越大,代表盘子越大,
                                                  上小下大

RESTART: C:\Users\dell\AppData\Local\Programs\Python\Python35\利用递归函数移动汉诺塔-list移动.py 此时 a为 [1, 2, 3] move a中的1-->到c 此时 c为 [1]

此时 a为 [2, 3] move a中的2-->到b 此时 b为 [2]

此时 c为 [1] move c中的1-->到b 此时 b为 [1, 2]

此时 a为 [3] move a中的3-->到c 此时 c为 [3]

此时 b为 [1, 2] move b中的1-->到a 此时 a为 [1]

此时 b为 [2] move b中的2-->到c 此时 c为 [2, 3]

此时 a为 [1] move a中的1-->到c 此时 c为 [1, 2, 3]


  • 1

Reply