漢羅塔是一種經(jīng)典的謎題,它的規(guī)則如下:
有三個(gè)棒,編號(hào)為A、B、C;
有 n 個(gè)盤(pán)子, 編號(hào)為1、2、3......n,他們按照從小到大的順序從A棒開(kāi)始擺放,最下面的編號(hào)為n,最上面的是編號(hào)為1。現(xiàn)在我們需要把A棒上的盤(pán)子全部移到C棒上,并且保證按照原來(lái)的規(guī)則擺放,即從下至上編號(hào)從大到小。在移動(dòng)過(guò)程中需要遵守以下規(guī)則:
每次只能移動(dòng)一個(gè)盤(pán)子;
每次移動(dòng)過(guò)程中,盤(pán)子都需要從一個(gè)棒挪到另外一個(gè)棒上;
小盤(pán)子不能放在大盤(pán)子的下面。
def hanoi(n, A, B, C):
if n == 1:
print(A, "-->", C)
else:
hanoi(n-1, A, C, B) # 把n-1個(gè)盤(pán)子從A通過(guò)C移到B
print(A, "-->", C) # 把第n個(gè)盤(pán)子從A移到C
hanoi(n-1, B, A, C) # 把n-1個(gè)盤(pán)子從B通過(guò)A移到C
if __name__ == '__main__':
n = 3
hanoi(n, "A", "B", "C")
上述代碼是求解漢羅塔問(wèn)題的Python代碼,其中,hanoi函數(shù)是遞歸實(shí)現(xiàn)的。當(dāng) n==1 時(shí),只需要將第一個(gè)盤(pán)子從A棒移到C棒,可以直接輸出即可。當(dāng)n>1時(shí),可以將問(wèn)題分成3個(gè)子問(wèn)題:
1. 把n-1個(gè)盤(pán)子從A通過(guò)C移到B;
2. 把第n個(gè)盤(pán)子從A移到C;
3. 把n-1個(gè)盤(pán)子從B通過(guò)A移到C。
遞歸通常通過(guò)代碼調(diào)用自身來(lái)實(shí)現(xiàn)。Python會(huì)默認(rèn)執(zhí)行最后一行代碼。在上面的代碼中,如果當(dāng)前文件被作為Python腳本執(zhí)行,那么__name__變量就會(huì)被賦值為"__main__"。