漢諾塔 非遞歸解法

  1. 代碼
# 不使用遞歸

def hanoi(n):
    tower_belong = [0] * n  # 用列表開闢 n 個空間,用於存放 n 個金片各自的編號,編號對應塔號
                            # 金片移動,編號對應更改
    if n % 2 == 0:          # 金片的編號對應這裏的塔號
        tower_name = ['A', 'B', 'C']    # 若 n 爲偶數,最終全部金片剛好能移到 C 塔
    else:
        tower_name = ['A', 'C', 'B']    # 若 n 爲奇數,最終全部金片會移到 B 塔
                                        # 用「輪換對稱」將 B、C 兩塔互換名字,以實現「負負得正」
    for step in range(1, 2**n):         # n 片金片最少須要移動 2^n - 1 次
        bin_step = bin(step)            # 求得 step 的二進制數值
        gold_num = len(bin_step) - bin_step.rfind('1') - 1
        # 計算 step 末尾 0 的個數,獲得金片編號
        # 如 step = 0b0001,則 step 末尾 0 的個數爲 0,表示此刻應移動 0 號金片
        # 如 step = 0b0100,則 step 末尾 0 的個數爲 2,表示此刻應移動 2 號金片,依此類推
        
        print('第', str(step), '步:移動', str(gold_num), '號塔,從', \
              tower_name[tower_belong[gold_num]], '到', end=' ') # 移出金片的塔
        if gold_num % 2 == 0:                                   # 若 num 爲 偶數,則右移
            tower_belong[gold_num] = (tower_belong[gold_num] + 1) % 3
            # 若從 C 塔右移,則又回到了 A 塔
        else:                                                   # 若 num 爲奇數,則左移
            tower_belong[gold_num] = (tower_belong[gold_num] + 2) % 3
            # 若從 A 塔左移,則又去到了 C 塔
        print(tower_name[tower_belong[gold_num]])               # 移入金片的塔
  1. 運行狀況
  • 3 層漢諾塔python

    hanoi(3)

    第 1 步:移動 0 號金片,從 A 到 Ccode

    第 2 步:移動 1 號金片,從 A 到 B遞歸

    第 3 步:移動 0 號金片,從 C 到 Bclass

    第 4 步:移動 2 號金片,從 A 到 C二進制

    第 5 步:移動 0 號金片,從 B 到 A移動

    第 6 步:移動 1 號金片,從 B 到 Cco

    第 7 步:移動 0 號金片,從 A 到 Ctar

相關文章
相關標籤/搜索