Java與C++分別用遞歸實(shí)現(xiàn)漢諾塔詳解
1.漢諾塔介紹
漢諾塔規(guī)則
1.有三根桿子A,B,C。A桿上有若干碟子
2.每次移動(dòng)一塊碟子,小的只能疊在大的上面
3.把所有碟子從A桿全部移到C桿上
經(jīng)過(guò)研究發(fā)現(xiàn),漢諾塔的破解很簡(jiǎn)單,就是按照移動(dòng)規(guī)則向一個(gè)方向移動(dòng)金片: 如3階漢諾塔的移動(dòng):A→C,A→B,C→B,A→C,B→A,B→C,A→C
2.解塔步驟
圓盤(pán):12345 柱子:ABC
1→C,2→B,1→B,3→C,1→A,2→C,1→C,4→B; 1→B,2→A,1→A,3→B,1→C,2→B,1→B,5→C; 1→A,2→C,1→C,4→A,1→B,2→A,1→A,4→C; 1→C,2→B,1→B,3→C,1→A,2→C,1→C,完成!
3.C++實(shí)現(xiàn)(遞歸結(jié)果及顯示步驟)
(1)遞歸結(jié)果
#include<iostream> using namespace std; int H_tower(int num); int main() { int num; cout<<"請(qǐng)輸入需要移動(dòng)的盤(pán)子數(shù)"<<endl; cin>>num; cout<<H_tower(num)<<endl; } int H_tower(int num) { if(num<1) { cout<<"請(qǐng)輸入大于等于一的數(shù)"<<endl; exit(-1); //輸入不合法,退出程序 } if(num==1) { return 1; } return (2*H_tower(num-1)+1);//規(guī)律遞歸 }
(2)顯示步驟
#include<iostream> using namespace std; void hannuo(int num); void Move(int &sum,int num,char A,char B,char C); int main() { int num; cout<<"請(qǐng)輸入需要移動(dòng)的盤(pán)子數(shù)"<<endl; cin>>num; hannuo(3); } void hannuo(int num) { if(num<1) { cout<<"請(qǐng)輸入大于等于一的數(shù)"<<endl; exit(-1); //輸入不合法,退出程序 } int sum=0; Move(sum,num,'A','B','C'); } void Move(int &sum,int num,char A,char B,char C) { if(num==1) { sum++; //圓盤(pán)只有一個(gè)時(shí),只需將其從A塔移到C塔 cout << "第 "<<sum<<" 次move " << num << " from " << A << " to " << C << endl; } else { Move(sum,num - 1, A, C, B);//遞歸,把A塔上編號(hào)1~n-1的圓盤(pán)移到B上,以C為輔助塔 sum++; cout << "第 "<<sum<<" 次move " << num << " from " << A << " to " << C << endl;//把A塔上編號(hào)為n的圓盤(pán)移到C上 Move(sum,num - 1, B, A, C);//遞歸,把B塔上編號(hào)1~n-1的圓盤(pán)移到C上,以A為輔助塔 } }
4.Java實(shí)現(xiàn)(遞歸結(jié)果及顯示步驟)
(1)遞歸結(jié)果
hannuo.java
import java.util.Scanner; public class hannuo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num; System.out.println("請(qǐng)輸入需要移動(dòng)的盤(pán)子數(shù)"); num= sc.nextInt(); tower t=new tower(); System.out.println("需要移動(dòng)的次數(shù) = "+t.H_tower(num)); } }
tower.java
public class tower { public int H_tower(int num) { if (num < 1) { System.out.println("請(qǐng)輸入大于等于一的數(shù)" ); } if (num == 1) { return 1; } return (2 * H_tower(num - 1) + 1);//規(guī)律遞歸 } }
(2)顯示步驟
hannuo.java
import java.util.Scanner; public class hannuo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num; System.out.println("請(qǐng)輸入需要移動(dòng)的盤(pán)子數(shù)"); num= sc.nextInt(); tower t=new tower(); t.hannuo(num); } }
tower.java
public class tower { public void hannuo(int num) { if(num<1) { System.out.println("請(qǐng)輸入大于等于一的數(shù)"); } int sum[]={0}; Move(num,'A','B','C'); } public void Move(int num,char A,char B,char C) { if(num==1) { //圓盤(pán)只有一個(gè)時(shí),只需將其從A塔移到C塔 System.out.println(" move " + num + " from " + A + " to " + C ); } else { Move(num - 1, A, C, B);//遞歸,把A塔上編號(hào)1~n-1的圓盤(pán)移到B上,以C為輔助塔 System.out.println(" move " + num + " from " + A + " to " + C );//把A塔上編號(hào)為n的圓盤(pán)移到C上 Move(num - 1, B, A, C);//遞歸,把B塔上編號(hào)1~n-1的圓盤(pán)移到C上,以A為輔助塔 } } }
到此這篇關(guān)于Java與C++分別用遞歸實(shí)現(xiàn)漢諾塔詳解的文章就介紹到這了,更多相關(guān)Java漢諾塔內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Java編寫(xiě)一個(gè)限流工具類RateLimiter
這篇文章主要為大家詳細(xì)介紹了如何基于Java編寫(xiě)一個(gè)限流工具類RateLimiter,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01Java實(shí)現(xiàn)轉(zhuǎn)跳不同系統(tǒng)使用枚舉加switch的方式示例
今天小編就為大家分享一篇關(guān)于Java實(shí)現(xiàn)轉(zhuǎn)跳不同系統(tǒng)使用枚舉加switch的方式示例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12java中排序報(bào):Comparison method violates its general contract異常的解
這篇文章主要給大家介紹了關(guān)于java中排序報(bào):Comparison method violates its general contract異常的解決方法,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-06-06使用jdbcTemplate查詢返回自定義對(duì)象集合代碼示例
這篇文章主要介紹了使用jdbcTemplate查詢返回自定義對(duì)象集合代碼示例,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02Java?方法(方法的定義,可變參數(shù),參數(shù)的傳遞問(wèn)題,方法重載,方法簽名)
這篇文章主要介紹了Java?方法(方法的定義,可變參數(shù),參數(shù)的傳遞問(wèn)題,方法重載,方法簽名),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-09-09SpringBoot實(shí)現(xiàn)文件上傳下載功能小結(jié)
最近做的一個(gè)項(xiàng)目涉及到文件上傳與下載功能。SpringBoot后臺(tái)如何實(shí)現(xiàn)文件上傳下載呢?下面有單文件上傳和多文件上傳功能,感興趣的朋友一起看看吧2017-08-08Java基礎(chǔ)之位運(yùn)算知識(shí)總結(jié)
最近接觸到了java位運(yùn)算,之前對(duì)位運(yùn)算的了解僅僅停留在表現(xiàn)結(jié)果上,乘2除以2,對(duì)背后的原理并不了解,現(xiàn)在學(xué)習(xí)記錄一下,需要的朋友可以參考下2021-05-05SpringBoot實(shí)現(xiàn)RabbitMQ三種使用方式
本文主要介紹了SpringBoot實(shí)現(xiàn)RabbitMQ三種使用方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07