問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
漢諾塔問題是一個經典的遞歸問題,對於這個問題,我們可以把它簡單的去看成是如何用n-1去表示n。
在A,B,C三個柱子上,我們先假設A柱上只有兩個盤子,那麼很簡單,只需要把最上面的那個盤子移到B柱上,再把A柱上最下面的盤子移到C柱上,最後把B柱的盤子移到C柱就可以了。
假設我們有n個盤子,那麼可以把最下面的盤子看成是第n個盤子,而我們要做的是把上面n-1個盤子移到B柱上,再把第n個盤子移到C柱。我們可以把B柱視爲主中轉站。
在將n-1個盤子移到B柱的過程中,我們需要藉助C柱作爲分中轉站,當完成n-1個盤子的移動時,此時B柱上存在n-1個盤子,而我們接下來要做的,和之前類似,就是藉助把n-2個盤子移動到A柱,把第n-1個盤子移動到C柱。在移動n-2個盤子到A柱時,我們同樣要藉助C作爲分中轉站。
現在問題就很清晰了,在移動的整個過程中,變換的只有AB這兩個主中轉站,而分中轉站C是不變的,因爲C作爲中轉的作用僅僅是爲了盤子在AB之間的移動。
這樣,我們很容易就可以用遞歸寫出整個過程的代碼。下面給出這個過程的python代碼:
def move(n,a,b,c):
if n==1:
print(a,"move to ",b)
else:
move(n-1,a,c,b)
move(1,a,b,c)
move(n-1,b,a,c)