漢諾塔問題是一個經典的問題。漢諾塔(Hanoi Tower),又稱河內塔,源自印度一個古老傳說。大梵天創造世界的時候做了三根鑽石柱子,在一根柱子上從下往上依照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只能移動一個圓盤。問應該如何操作?
我自己的理解就是:將自身的問題不斷減少規模,直到減少到無法減少為止。 (到達遞歸結束條件)然後從小問題開始解決,小問題逐一解決之後,大問題也就迎刃而解了(遞歸回來了)
原問題不斷減小為規模較小的原問題,然後小規模的原問題解決了,從而解決原來的大問題!
減少規模、從小解決、遞迴回來、解決原始問題! ! !
(1)有遞迴結束條件。
(2)不斷呼叫自身,減少問題規模,向遞歸結束條件靠攏。
有三根柱子,分別名為A,B,C。初始時,在柱子A上有n個圓盤,他們從下到上,盤子的大小是從大到小。在移動和擺放的過程中,小盤子必須在大盤子上面。在保證規則的情況下,將柱子A上的所有盤子,移動到柱子C,移動中可以藉助柱子B,但是得保證移動過程中小盤子必須得在大盤子上! ! !請列印出移動過程?
(1)將最上面的n-1個盤子,從A借助C移動到B
(2)將最下面的一個盤子,從A移到C
(3)將最上面的n-1個盤子,從B借助A移到C
遞歸的結束條件:
問題規模變成盤子數為0時,因為盤子數為0時就不需要移動了! ! !
# coding:utf-8 """ n为初始时A柱上的盘子数 a为起始盘子所在的柱子 b为中转柱子 c为目的地柱子 """ def hanoi(n, a, b, c): if n > 0: hanoi(n-1, a, c, b) print("盘子从%s移动到%s" % (a, c)) hanoi(n-1, b, a, c) hanoi(3, "A", "B", "C")
以上是如何使用Python實現漢諾塔問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!