看譚老師著名的c語言教材一直沒有搞懂漢諾塔的遞迴原理,
偶爾看到一本c++教材上講解的比較詳細,就用python寫了乙個解法,總共5行**,還是挺簡單的。寫的時間比較久遠了,等我找到那本書,再把書中的解析附上。
# 引數的含義為(盤子總數,起始杆,中間杆,目標杆)
defmovedisk
(count, needle1, needle2, needle3)
:if count >0:
# 將除最底盤以外的盤子從1杆移到2杆
movedisk(count-
1, needle1, needle3, needle2)
# 將最底盤從1杆移到3杆
print
("move disk"
, count,
"from"
, needle1,
"to"
, needle3)
# 將除最底盤以外的盤子從2杆移到3杆,任務完成
movedisk(count-
1, needle2, needle1, needle3)
驗證一下結果
#當有三個盤子的時候
movedisk(3,
'needle1'
,'needle2'
,'needle3'
)
輸出結果:
1. move disk 1 from needle1 to needle3
2. move disk 2 from needle1 to needle2
3. move disk 1 from needle3 to needle2
4. move disk 3 from needle1 to needle3
5. move disk 1 from needle2 to needle1
6. move disk 2 from needle2 to needle3
7. move disk 1 from needle1 to needle3
[finished in 0.2s]
理解的關鍵在於,將3個盤子分成兩部分,即上面的盤子(2個)和底盤(第3個),將上面的2個盤子視為乙個整體,這樣,將3個盤子從1杆移到3杆只需三步:
將上面的盤子從1杆移到2杆 (前3步)
將底盤從1杆移到3杆 (第4步)
將上面的盤子從2杆移到3杆 (後3步)
像不像把大象裝進冰箱這個梗的步驟,只要按遞迴思想實現了**,具體的函式如何呼叫,就交給計算機吧。
當有n個盤子的話,最少需要移動2的n次方減1步。即,3個盤子需要移動2^3-1
終於找到了 ,原書是《c++程式設計–資料結構與程式設計方法》p339:
關於遞迴思想的理解,可以參考《資料結構與演算法分析——c++描述》第三版。
# 先列印7654 (76543//10)
(n %10)
# 接著列印3 (76543%10)
print_out(
76543
)當然,目前看到的對遞迴最詳細易懂的解釋是《c語言程式設計與問題求解(第七版)》第九章,這本書英文名為《problem solving and program design in c》 ,也被翻譯為《c語言詳解》
遞迴解漢諾塔
漢諾塔問題是乙個經典的問題。漢諾塔 hanoi tower 又稱河內塔,源於印度乙個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著n片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,任何時候,在小圓盤上都不能放大圓盤,且在三...
用Python遞迴實現漢諾塔問題
漢諾塔 又稱河內塔 問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。我曾經遇到過幾次...
python遞迴實現漢諾塔
實現思路 1.將a上 n 1個移動到b 2.將a上最後乙個移動到c 3.將b上 n 1個移動到a 4.將b上最後乙個移動到c 重複上面步驟即可 python 實現如下 全域性變數cnt 統計移動次數 global cnt cnt 0 def move x,y global cnt 再次宣告,表示在這...