【題目】post
漢諾塔問題比較經典,這裏修改一下游戲規則:如今限制不能從最左側的塔直接移動到最右側,也不能從最右側直接移動到最左側,而是必須通過中間。求當塔有N層的時候,打印最優移動過程和最優移動總步數。.net
例如,當塔數爲兩層時,最上層的塔記爲1,最下層的塔記爲3d
2,則打印:cdn
注意:關於漢諾塔遊戲的更多討論,將在本書遞歸與動態規劃的章節中繼續。blog
【要求】遞歸
用如下兩種方法解決。遊戲
方法一:遞歸的方法;qt
方法二:非遞歸的方法,用棧來模擬漢諾塔的三個塔;it
本文將講述方法一:io
【解答】
方法一:遞歸的方法。
首先,若是隻剩最上層的塔須要移動,則有以下處理
1.若是但願從「左」移到「中」,打印「Move1 from left to mid」。
2.若是但願從「中」移到「左」,打印「Move1 from mid to left」。
3.若是但願從「中」移到「右」,打印「Move1 from mid to right」。
4.若是但願從「右」移到「中」,打印「Mve1 from right to mid」。
5.若是但願從「左」移到「右」,打印"Move1 from left to mid」和"Move1 from mid to right"。
6.若是但願從「右」移到「左」,打印「Move1 from right to mid"和「Move1 from mid to left」。
以上過程就是遞歸的終止條件,也就是隻剩上層塔時的打印過程。
接下來,咱們分析剩下多層塔的狀況。
若是剩下N層塔,從最上到最下依次爲1~N,則有以下判斷:
1.若是剩下的N層塔都在「左」,但願所有移到「中」,則有三個步驟。
1)將1~N-1層塔先所有從「左」移到「右」,明顯交給遞歸過程。
2)將第N層塔從「左」移到「中」。
3)再將1~N-1層塔所有從「右」移到「中」,明顯交給遞歸過程。
2.若是把剩下的N層塔從「中」移到「左」,從「中」移到「右」,從「右」移到「中」,過程與狀況1同理,同樣是分解爲三步,在此再也不詳述。
3.若是剩下的N層塔都在「左」,但願所有移到「右」,則有五個步驟。
1)將1~N-1層塔先所有從「左」移到「右」,明顯交給遞歸過程。
2)將第N層塔從「左」移到「中」。
3)將1~N-1層塔所有從「右」移到明顯交給遞歸過程。
4)將第N層塔從「中」移到「右」。
5)最後將1~N-1層塔所有從「左」移到「右」,明顯交給遞歸過程。
4.若是剩下的N層塔都在「右」,但願所有移到「左」,過程與狀況3同理,同樣是分解爲五步,在此再也不詳述。
以上遞歸過程通過邏輯化簡以後的代碼請參看以下代碼中的hanoi Problem1方法。
歡迎一塊兒來交流代碼那點事:https://mp.csdn.net/postedit/80325970?utm_source=zwqtpgc-image/152699529623017eaf2ec59