資料結構學習(C++)——遞迴【2】(1) (轉)
漢諾塔的非遞迴解法
(真的很抱歉,由於CSDN能貼的長度有限,所以分成了4部分,讓您麻煩了。——我用表格拼成的盤子,導致HTML程式碼數量激增,雖然看起來不長,但是實際上相當的長。)
似乎這個問題的最佳解法就是遞迴,如果你想用棧來消解掉遞迴達到形式上的消除遞迴,你還是在使用遞迴的思想,因此,他本質上還是一個遞迴的演算法。我們這本黃皮書在談論到“什麼情況使用遞迴”的時候,在“3.問題的解法是遞迴的”這裡面,就這樣說了“有些問題只能用遞迴的方法來解決,一個典型的例子就是漢諾塔”。
但我堅信,如果一個問題能用分析的辦法解決——遞迴實際上就是一個分析解法,能將問題分解成-1規模的同等問題和移動一個盤子,如果這樣分解下去一定會有解,最後分解到移動1號盤子,問題就解決了——那麼我也應該能用綜合的辦法解決,就是從當前的狀態來確定怎樣移動,而不是逆推得到決定。這是對實際工作過程的一個模擬,試想如果讓我們去搬盤子,我們肯定不會用遞迴來思考現在應該怎麼搬——只要8個盤子,我們腦子裡的“工作棧”恐怕就要了——我們要立即決定怎麼搬,而不是從多少步之後的情景來知道怎麼搬。下面我們透過模擬人的正向思維來尋找這個解法。
假設如下搬7個盤子的初始狀態(選用7個是因為我曾經寫出了一個1~6結果正確的演算法,而在7個的時候才發現一個條件的選擇錯誤,具體大家自己嘗試吧),我們唯一的選擇就是搬動1號盤子,但是我們的問題是向B搬還是向C搬?
1
:namespace prefix = o ns = "urn:schemas--com::office" />
2
3
4
5
6
7
A
B
C
顯然,我們必須將7號盤子搬到C,在這之前要把6號搬到B,5號就要搬到C,……以此類推,就會得出結論(規律1):當前柱最上面的盤子的目標柱應該是,從當前柱上“需要搬動的盤子”最下面一個的目標柱,向上交替目標柱到它時的目標柱。就是說,如果當前柱是A,需要移動m個盤子,從上面向下數的第m個盤子的目標柱是C,那麼最上面的盤子的目標柱就是這樣:if (m % 2) 目標和第m個盤子的目標相同(C);else 目標和第m個盤子的目標不同(B)。接下來,我們需要考慮如果發生了阻塞,該怎麼辦,如下所示:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-959480/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料結構學習(C++)——遞迴【1】 (轉)資料結構C++遞迴
- 資料結構學習(C++)——遞迴【2】(2) (轉)資料結構C++遞迴
- 資料結構學習(C++)——遞迴【3】(1) (轉)資料結構C++遞迴
- 資料結構學習(C++)——遞迴【2】(3) (轉)資料結構C++遞迴
- 資料結構學習(C++)——遞迴【2】(4) (轉)資料結構C++遞迴
- 資料結構學習(C++)——遞迴【3】(2) (轉)資料結構C++遞迴
- 資料結構學習(C++)——迴圈連結串列 (轉)資料結構C++
- 資料結構與演算法學習總結--遞迴資料結構演算法遞迴
- 資料結構-遞迴資料結構遞迴
- 資料結構學習筆記-遞迴求解森林高度資料結構筆記遞迴
- 資料結構學習(C++)——二叉樹【1】 (轉)資料結構C++二叉樹
- 資料結構學習(C++)——序言 (轉)資料結構C++
- 資料結構學習(C++)——二叉樹【2】 (轉)資料結構C++二叉樹
- 資料結構學習(C++)——圖【2】(DFS和BFS) (轉)資料結構C++
- 資料結構學習(C++)——圖(總結) (轉)資料結構C++
- 資料結構學習(C++)——樹(總結) (轉)資料結構C++
- 資料結構學習(C++)——圖【1】(基本儲存方法) (轉)資料結構C++
- 資料結構學習(C++)續——排序【1】測試程式 (轉)資料結構C++排序
- 資料結構學習(C++)續——排序【2】插入排序 (轉)資料結構C++排序
- 資料結構學習(C++)——線性鏈式結構總結(代後記)【1】 (轉)資料結構C++
- 資料結構學習(C++)——線性鏈式結構總結(代後記)【2】 (轉)資料結構C++
- 資料結構5_遞迴資料結構遞迴
- 資料結構學習(C++)——雙向連結串列 (轉)資料結構C++
- 資料結構學習(C++)——稀疏矩陣(十字連結串列【1】) (轉)資料結構C++矩陣
- 資料結構學習(C++)——稀疏矩陣(十字連結串列【2】) (轉)資料結構C++矩陣
- 資料結構學習(c++)——二叉樹 (轉)資料結構C++二叉樹
- 基礎資料結構之遞迴資料結構遞迴
- 前端學習 資料結構與演算法 快速入門 系列 —— 遞迴前端資料結構演算法遞迴
- 【資料結構】二叉樹遍歷(遞迴+非遞迴)資料結構二叉樹遞迴
- 資料結構學習(C++)續——排序【3】交換排序 (轉)資料結構C++排序
- 資料結構學習(C++)——圖【4】(最短路徑) (轉)資料結構C++
- 資料結構學習(C++)——二叉樹【3】 (轉)資料結構C++二叉樹
- 資料結構和演算法:遞迴資料結構演算法遞迴
- 資料結構:歸併排序(非遞迴)資料結構排序遞迴
- 資料結構與演算法:遞迴資料結構演算法遞迴
- 關於樹型結構資料遞迴查詢,轉非遞迴查詢的實現遞迴
- 資料結構學習筆記1資料結構筆記
- 【資料結構】遞迴實現連結串列逆序資料結構遞迴