概述:
據說古代有一個梵塔,塔內有三個底座A、B、C,A座上有64個盤子,盤子大小不等,大的在下,小的在上。
有一個和尚想把這64個盤子從A座移到C座,但每次只能允許移動一個盤子,在移動盤子的過程中可以利用B座,但任何時刻3個座上的盤子都必須始終保持大盤在下、小盤在上的順序。如果只有一個盤子,則不需要利用B座,直接將盤子從A移動到C即可。和尚想知道這項任務的詳細移動步驟和順序。
這實際上是一個非常巨大的工程,是一個不可能完成的任務。
根據數學知識我們可以知道,移動n個盤子需要(2^n-1)步,64個盤子需要18446744073709551615步。如果每步需要一秒鍾的話,那么就需要584942417355.072年。
def hannuo(num, src, dst, temp=None): #聲明用來記錄移動次數的變量為全局變量 global times #確認參數類型和范圍(可不寫) #---------------------------------------------------------------- assert type(num) == int, 'num must be integer' assert num > 0, 'num must > 0' #---------------------------------------------------------------- #只剩最后或只有一個盤子需要移動,這也是函數遞歸調用的結束條件 if num == 1: print('The {0} Times move:{1}==>{2}'.format(times, src, dst)) times += 1 else: #遞歸調用函數自身, #先把除最后一個盤子之外的所有盤子移動到臨時柱子上 hannuo(num-1, src, temp, dst) #把最后一個盤子直接移動到目標柱子上 hannuo(1, src, dst) #把除最后一個盤子之外的其他盤子從臨時柱子上移動到目標柱子上 hannuo(num-1, temp, dst, src) #用來記錄移動次數的變量 times = 1 #A表示最初放置盤子的柱子src,C是目標柱子dst,B是臨時柱子temp
n = int(input()) hannuo(n, 'A', 'C', 'B')
n = 3時,效果如圖
【擴展實例】
漢諾塔實踐
描述
請補充編程模板中代碼,完成如下功能:
有三個圓柱A、B、C,初始時A上有N個圓盤,N由用戶輸入給出,最終移動到圓柱C上。
每次移動步驟的表達方式示例如下:[STEP 10] A->C。其中,STEP是步驟序號,寬度為4個字符,右對齊。
請編寫代碼,獲得輸入N后,輸出漢諾塔移動的步驟。
輸入格式
一個整數
輸出格式
每個步驟一行,每行參考格式如下:[STEP 10] A->C
輸入輸出示例
輸入 | 輸出 | |
示例 1 | |
|
steps = 0 def hanoi(src, des, mid, n): global steps if n == 1: steps += 1 print("[STEP{:>4}] {}->{}".format(steps, src, des)) else: hanoi(src, mid, des, n-1) steps += 1 print("[STEP{:>4}] {}->{}".format(steps, src, des)) hanoi(mid, des, src, n-1) N = eval(input()) hanoi("A", "C", "B", N)