# 不使用遞歸 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]]) # 移入金片的塔
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