日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

经典汉诺塔(Java初学递归篇)

發布時間:2023/12/19 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 经典汉诺塔(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時*
1、From頂部的n-1個盤子移動到Helper
2、From最底部的大大大盤子移動到To
3、Helper上面的n-1個盤子移動到To
問題規模為n-1時
1、From頂部的(n-1)-1 個盤子移動到Helper
2、From底部的大大盤子移動到To
3、Helper上面的(n-1)-1 個盤子移動到To
問題規模為2時
1、From頂部的 1 個盤子移動到Helper
2、From底部的大盤子移動到To
3、Helper上面的 1 個盤子移動到To

來人!上圖(手動起草)

????????這是遞歸算法的第一個空間棧中計算機所需要做的事情,但并不是三步即可搞定,它會從這個空間中直線引申出許多另外的空間,來解決當前空間的子問題,再一步步回代,當第一個空間中的事情解決了,問題也就解決了。

遞歸邏輯出來,可以根據其進行碼代(分別對應上圖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方法:打印解的步驟)

import java.util.*;public class Solution {public static void Hanoi(int n,String From,String To ,String Helper) {//出口if (n==1) {Move(n,From,To);return;}//對應圖中第一步:把n-1個盤子移動到HelperHanoi(n-1, From, Helper, To);//對應圖中第二步:把最底下的盤子移動到ToMove(n, From, To);//對應圖中第三步:把n-1個盤子移動到ToHanoi(n-1, Helper, To, From);}public static void Move(int n,String From,String To) {//打印解的步驟System.out.println("移動" + n + "號盤子從" + From + "到" + To);}public static void main(String[] args) {//借助Helper,把5個盤子從From移動到ToHanoi(5, "From", "To", "Helper");} }

想起我的數據結構李師之前說的一番話:
????????遞歸代碼少,思路對了設計起來也是比較簡單,但真正一步步去細想和演算,是非常困難的一件事情,所以把這件事交給計算機,我們做不到的它可以幫我們做到…

(完)

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的经典汉诺塔(Java初学递归篇)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。