java 實(shí)現(xiàn)漢諾塔詳解及實(shí)現(xiàn)代碼
java 實(shí)現(xiàn)漢諾塔詳解及實(shí)現(xiàn)代碼
漢諾塔問(wèn)題:有三根柱子A,B,C,其中A上面有n個(gè)圓盤(pán),從上至下圓盤(pán)逐漸增大,每次只能移動(dòng)一個(gè)圓盤(pán),并且規(guī)定大的圓盤(pán)不能疊放在小的圓盤(pán)上面,現(xiàn)在想要把A上面的n個(gè)圓盤(pán)全部都移動(dòng)到C上面,輸出移動(dòng)的總步數(shù)以及移動(dòng)的過(guò)程
分析:
//先求出移動(dòng)的總步數(shù) 1,假設(shè)g(n)表示n個(gè)圓盤(pán)時(shí)的移動(dòng)總的步數(shù),當(dāng)n=1時(shí),g(1)=1; 2.現(xiàn)在可以把g(n)進(jìn)行細(xì)分為三步: 1>先將n-1個(gè)圓盤(pán)從A通過(guò)C移動(dòng)到B上面,相當(dāng)于將n-1個(gè)圓盤(pán)從A移動(dòng)到C,因此需要g(n-1)步; 2>然后將剩下的最大的圓盤(pán)從A移動(dòng)到C,需要1步; 3>最后再將n-1個(gè)圓盤(pán)從B通過(guò)A移動(dòng)到C上面,相當(dāng)于將n-1個(gè)圓盤(pán)從A移動(dòng)到C,因此也需要g(n-1)步; 因此可以得出遞歸關(guān)系式:g(n) = 2*g(n-1)+1; //現(xiàn)在我們?cè)趤?lái)求出移動(dòng)的過(guò)程 1.假設(shè)hm(m,a,b,c)表示將m個(gè)圓盤(pán)從a通過(guò)b移動(dòng)到c的過(guò)程,假設(shè)mv(a,c)輸出一次a到c的過(guò)程,即print a-->c 2.初始化hm,當(dāng)m=1時(shí),hm(1,a,b,c)=mv(a,c); 2.可以把hm(m,a,b,c)進(jìn)行細(xì)分為三步: 1>先將n-1個(gè)圓盤(pán)從A通過(guò)C移動(dòng)到B,此時(shí)b和c進(jìn)行互換,也就是 hm(m-1,a,c,b); 2>然后將剩下的最大的圓盤(pán)從A移動(dòng)到C,也就是hm(1,a,b,c); 3>最后將n-1個(gè)圓盤(pán)從B通過(guò)A移動(dòng)到C,此時(shí)b和a進(jìn)行交換,也就是 hm(m-1,b,a,c); 最終得到過(guò)程的遞歸關(guān)系式:hm(m,a,b,c) = hm(m-1,a,c,b)+1+hm(m-1,b,a,c);
實(shí)現(xiàn)代碼:
public class test{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
test t = new test();
//獲取總的步數(shù)
System.out.println("需要移動(dòng)的總步數(shù)為:" +t.getSum(n));
//獲取移動(dòng)的過(guò)程
t.hm(n,'a','b','c');
}
//獲取總步數(shù)
public int getSum(int n){
if(n == 1)
return 1;
return 2 * getSum(n-1) +1 ;
}
//獲取移動(dòng)的過(guò)程
public void hm(int m,char a,char b,char c){
if(m == 1)
move(a,c);
hm(m-1,a,c,b);
move(a,c);
hm(m-1,b,a,c);
}
//輸出一次移動(dòng)的過(guò)程
public void move(char a,char c){
System.out.print(a + "-->" + c + " ");
}
}
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
詳解基于java的Socket聊天程序——客戶(hù)端(附demo)
這篇文章主要介紹了詳解基于java的Socket聊天程序——客戶(hù)端(附demo),客戶(hù)端設(shè)計(jì)主要分成兩個(gè)部分,分別是socket通訊模塊設(shè)計(jì)和UI相關(guān)設(shè)計(jì)。有興趣的可以了解一下。2016-12-12
MyBatis3用log4j在控制臺(tái)輸出SQL的方法示例
本篇文章主要介紹了MyBatis3用log4j在控制臺(tái)輸出SQL的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
SpringBoot統(tǒng)一處理功能實(shí)現(xiàn)的全過(guò)程
最近在做項(xiàng)目時(shí)需要對(duì)異常進(jìn)行全局統(tǒng)一處理,主要是一些分類(lèi)入庫(kù)以及記錄日志等,下面這篇文章主要給大家介紹了關(guān)于SpringBoot統(tǒng)一功能處理實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
mybatis插件pageHelper實(shí)現(xiàn)分頁(yè)效果
這篇文章主要為大家詳細(xì)介紹了mybatis插件pageHelper實(shí)現(xiàn)分頁(yè)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
探討Java中函數(shù)是值傳遞還是引用傳遞問(wèn)題
這篇文章主要介紹了探討Java中函數(shù)是值傳遞還是引用傳遞問(wèn)題,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
idea配置springboot熱部署終極解決辦法(解決熱部署失效問(wèn)題)
這篇文章主要介紹了idea配置springboot熱部署終極解決辦法(解決熱部署失效問(wèn)題),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-07-07
SpringBoot favicon Chrome設(shè)置問(wèn)題解決方案
在本篇文章里小編給大家分享的是關(guān)于SpringBoot favicon Chrome設(shè)置問(wèn)題實(shí)例內(nèi)容,小的朋友們可以參考學(xué)習(xí)下。2020-02-02
java實(shí)現(xiàn)簡(jiǎn)單的俄羅斯方塊
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單的俄羅斯方塊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01

