经典汉诺塔(Java初学递归篇)
????????大一學C的時候已經接觸到漢諾塔遞歸的問題,當時只是簡單了解過方法,最近開了算法課,打算重新捋一捋。
題目描述:
????????有三根柱子分別為A、B、C,柱子A上從下到上按金字塔狀疊放著n個不同大小的圓盤,要把所有盤子一個一個移動到柱子C上,并且每次移動同一根柱子上都不能出現大盤子在小盤子上方,求解此過程。
(圖片來源:http://www.hannuota.cn/)
????????剛拿到題目,我假設n為1,即拿起來放過去即可;假設n為2,先把上面的小盤子拿起放到B,再把下面的大盤子拿起放到C,最后把小盤子拿起放到C;假設n為3…
????????當n到5、6的時候,解答就變得困難了。我嘗試開始從前面的情況中尋找規律,但好像并不可觀…
???????????????漢諾塔小游戲: Tower of Hanoi.
(動手能力強的朋友可以去上面這個網站玩一下模擬的小游戲)
網上檢索后發現遞歸是解這個題目的方法,接著我換了個思路…
????????從大的角度想,要把n個盤子移動到目標柱子,是不是要先解決把n-1個盤子移動過去的問題呢?…按這路子一直套娃,解決掉最小子問題即1個盤子的時候,問題似乎好像就可以化繁為簡…
???????????????????????????
按這種思路,很容易就能想到設計這個遞歸算法的邏輯關鍵:
(A用From代替表示起點柱子,B用Helper代替表示輔助柱子,C用To代替表示目標柱子)
問題規模為n時*…
來人!上圖(手動起草)
????????這是遞歸算法的第一個空間棧中計算機所需要做的事情,但并不是三步即可搞定,它會從這個空間中直線引申出許多另外的空間,來解決當前空間的子問題,再一步步回代,當第一個空間中的事情解決了,問題也就解決了。
遞歸邏輯出來,可以根據其進行碼代(分別對應上圖3個步驟):
//對應圖中第一步:把n-1個盤子移動到HelperHanoi(n-1, From, Helper, To);//對應圖中第二步:把最底下的盤子移動到ToMove(n, From, To);//對應圖中第三步:把n-1個盤子移動到ToHanoi(n-1, Helper, To, From);然后是遞歸出口的問題(即n-1為1的時候)
//出口if (n==1) {Move(n,From,To);return;}(跑一跑代碼,蕪湖,迎刃而解~)
完整的代碼:
(Move方法:打印解的步驟)
想起我的數據結構李師之前說的一番話:
????????遞歸代碼少,思路對了設計起來也是比較簡單,但真正一步步去細想和演算,是非常困難的一件事情,所以把這件事交給計算機,我們做不到的它可以幫我們做到…
(完)
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的经典汉诺塔(Java初学递归篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中信银行24小时人工怎么转 中信银行电话
- 下一篇: java美元兑换,(Java实现) 美元