使用Python實(shí)現(xiàn)漢諾塔問題示例
前言
漢諾塔問題是一個經(jīng)典的問題。漢諾塔(Hanoi Tower),又稱河內(nèi)塔,源于印度一個古老傳說。大梵天創(chuàng)造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規(guī)定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只能移動一個圓盤。問應(yīng)該如何操作?
1.先談一下什么是遞歸?
我自己的理解就是:將自身的問題不斷減小規(guī)模,直到減小到無法減小為止。(到達(dá)遞歸結(jié)束條件)然后從小問題開始解決,小問題逐個解決之后,大問題也就迎刃而解了(遞歸回來了)
2.簡而言之就是:
原問題不斷減小為規(guī)模更小的原問題,然后小規(guī)模的原問題解決了,從而解決原來的大問題!
3.過程為:
減小規(guī)模、從小解決、遞歸回來、解決原問題?。?!
4.遞歸的關(guān)鍵是:
(1)有遞歸結(jié)束條件。
(2)不斷調(diào)用自身,減小問題規(guī)模,向遞歸結(jié)束條件靠攏。
漢諾塔問題
1.問題描述
有三根柱子,分別名為A,B,C。初始時,在柱子A上有n個圓盤,他們從下到上,盤子的大小是從大到小。在移動和擺放的過程中,小盤子必須在大盤子上面。 在保證規(guī)則的情況下,將柱子A上的所有盤子,移動到柱子C,移動中可以借助柱子B,但是得保證移動過程中小盤子必須得在大盤子上?。?! 請打印出移動過程?
2.問題分析 遞歸的過程:
(1)將最上面的n-1個盤子,從A借助C移動到B
(2)將最下面的一個盤子,從A移動到C
(3)將最上面的n-1個盤子,從B借助A移動到C
遞歸的結(jié)束條件:
問題規(guī)模變成盤子數(shù)為0時,因?yàn)楫?dāng)盤子數(shù)為0時就不需要移動了?。?!
3.代碼(Python)
# coding:utf-8 """ n為初始時A柱上的盤子數(shù) a為起始盤子所在的柱子 b為中轉(zhuǎn)柱子 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")
4.結(jié)果展示
到此這篇關(guān)于使用Python實(shí)現(xiàn)漢諾塔問題示例的文章就介紹到這了,更多相關(guān)Python漢諾塔問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決plt.savefig()和plt.show()方法得到的圖片不一樣問題
這篇文章主要介紹了解決plt.savefig()和plt.show()方法得到的圖片不一樣問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08Pygame坦克大戰(zhàn)游戲開發(fā)實(shí)戰(zhàn)詳解代碼
《坦克大戰(zhàn)》以二戰(zhàn)坦克為題材,既保留了射擊類游戲的操作性,也改進(jìn)了射擊類游戲太過于復(fù)雜難玩的高門檻特點(diǎn),集休閑與競技于一身。經(jīng)典再度襲來,流暢的畫面,瘋狂的戰(zhàn)斗,讓玩家再次進(jìn)入瘋狂坦克的世界。玩家的目標(biāo)是控制坦克躲避危險(xiǎn),消滅掉所有的敵人即可進(jìn)入下一關(guān)2022-02-02淺談Python中的可迭代對象、迭代器、For循環(huán)工作機(jī)制、生成器
這篇文章主要介紹了Python中的可迭代對象、迭代器、For循環(huán)工作機(jī)制、生成器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03