Java使用遞歸法解決漢諾塔問題的代碼示例
漢諾(Hanoi)塔問題:古代有一個(gè)梵塔,塔內(nèi)有三個(gè)座A、B、C,A座上有n個(gè)盤子,盤子大小不等,大的在下,小的在上(如圖)。
有一個(gè)和尚想把這n個(gè)盤子從A座移到B座,但每次只能允許移動(dòng)一個(gè)盤子,并且在移動(dòng)過程中,3個(gè)座上的盤子始終保持大盤在下,小盤在上。在移動(dòng)過程中可以利用B座,要求打印移動(dòng)的步驟。如果只有一個(gè)盤子,則不需要利用B座,直接將盤子從A移動(dòng)到C。
- 如果有2個(gè)盤子,可以先將盤子1上的盤子2移動(dòng)到B;將盤子1移動(dòng)到c;將盤子2移動(dòng)到c。這說明了:可以借助B將2個(gè)盤子從A移動(dòng)到C,當(dāng)然,也可以借助C將2個(gè)盤子從A移動(dòng)到B。
- 如果有3個(gè)盤子,那么根據(jù)2個(gè)盤子的結(jié)論,可以借助c將盤子1上的兩個(gè)盤子從A移動(dòng)到B;將盤子1從A移動(dòng)到C,A變成空座;借助A座,將B上的兩個(gè)盤子移動(dòng)到C。這說明:可以借助一個(gè)空座,將3個(gè)盤子從一個(gè)座移動(dòng)到另一個(gè)。
- 如果有4個(gè)盤子,那么首先借助空座C,將盤子1上的三個(gè)盤子從A移動(dòng)到B;將盤子1移動(dòng)到C,A變成空座;借助空座A,將B座上的三個(gè)盤子移動(dòng)到C。
Java代碼如下:
public class Hanoi { public static void main(String[] args) { int disk = 3; //盤子 move(disk, 'A', 'B', 'C'); } /* * 根據(jù)題意,從上向下編號(hào) => 1 ~ n */ /** * * @param topN 源塔頂?shù)谋P子編號(hào) * @param from 從哪個(gè)塔移動(dòng) * @param inter 中介,過渡的塔 * @param to 目的塔 */ private static void move(int topN, char from, char inter, char to) { if (topN == 1) { System.out.println("Disk 1 from " + from + " to " + to); } else { move(topN - 1, from, to, inter); System.out.println("Disk " + topN + " from " + from + " to " + to); move(topN - 1, inter, from, to); } } }
out
Disk 1 from A to C Disk 2 from A to B Disk 1 from C to B Disk 3 from A to C Disk 1 from B to A Disk 2 from B to C Disk 1 from A to C
相關(guān)文章
SpringBoot應(yīng)用部署到Tomcat中無(wú)法啟動(dòng)的解決方法
這篇文章主要介紹了SpringBoot應(yīng)用部署到Tomcat中無(wú)法啟動(dòng)的解決方法,需要的朋友可以參考下2017-09-09Java 常用類解析:java異常機(jī)制,異常棧,異常處理方式,異常鏈,異常丟失詳解
這篇文章主要介紹了Java 常用類解析:java異常機(jī)制,異常棧,異常處理方式,異常鏈,異常丟失詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03Java如何使用spire進(jìn)行word文檔的替換詳解
創(chuàng)作一份文案經(jīng)常會(huì)高頻率地使用某些詞匯,如地名、人名、人物職位等,若表述有誤,就需要整體撤換,下面這篇文章主要給大家介紹了關(guān)于Java如何使用spire進(jìn)行word文檔的替換的相關(guān)資料,需要的朋友可以參考下2023-01-01SpringBoot實(shí)現(xiàn)定時(shí)發(fā)送郵件的三種方法案例詳解
這篇文章主要介紹了SpringBoot三種方法實(shí)現(xiàn)定時(shí)發(fā)送郵件的案例,Spring框架的定時(shí)任務(wù)調(diào)度功能支持配置和注解兩種方式Spring?Boot在Spring框架的基礎(chǔ)上實(shí)現(xiàn)了繼承,并對(duì)其中基于注解方式的定時(shí)任務(wù)實(shí)現(xiàn)了非常好的支持,本文給大家詳細(xì)講解,需要的朋友可以參考下2023-03-03Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之學(xué)生管理系統(tǒng)的實(shí)現(xiàn)
只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+Springboot+Maven+mybatis+Vue+Mysql實(shí)現(xiàn)學(xué)生管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2022-03-03Spring?Boot?整合持久層之Spring Data JPA
在介紹Spring Data JPA的時(shí)候,我們首先認(rèn)識(shí)下Hibernate。Hibernate是數(shù)據(jù)訪問解決技術(shù)的絕對(duì)霸主,使用O/R映射技術(shù)實(shí)現(xiàn)數(shù)據(jù)訪問,O/R映射即將領(lǐng)域模型類和數(shù)據(jù)庫(kù)的表進(jìn)行映射,通過程序操作對(duì)象而實(shí)現(xiàn)表數(shù)據(jù)操作的能力,讓數(shù)據(jù)訪問操作無(wú)須關(guān)注數(shù)據(jù)庫(kù)相關(guān)的技術(shù)2022-08-08eclipse啟動(dòng)出現(xiàn)“failed to load the jni shared library”問題解決
這篇文章主要介紹了eclipse啟動(dòng)出現(xiàn)“failed to load the jni shared library”問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(23)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07