最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java用遞歸方法解決漢諾塔問(wèn)題詳解

 更新時(shí)間:2022年04月14日 10:39:38   作者:Killing?Vibe  
漢諾塔問(wèn)題是一個(gè)經(jīng)典的問(wèn)題。漢諾塔(Hanoi?Tower),又稱(chēng)河內(nèi)塔,源于印度一個(gè)古老傳說(shuō)。本文將用Java遞歸方法求解這一問(wèn)題,感興趣的可以學(xué)習(xí)一下

前言

博主之前有寫(xiě)過(guò)關(guān)于遞歸問(wèn)題的思維模式:

遞歸的思路

下面將用這種思維模式來(lái)求解經(jīng)典漢諾塔問(wèn)題。

一、問(wèn)題描述

漢諾塔(又稱(chēng)河內(nèi)塔)問(wèn)題是源于印度一個(gè)古老傳說(shuō)。大梵天創(chuàng)造世界的時(shí)候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤(pán)。

大梵天命令婆羅門(mén)把圓盤(pán)從下面開(kāi)始按大小順序重新擺放在另一根柱子上。

并且規(guī)定,在小圓盤(pán)上不能放大圓盤(pán),在三根柱子之間一次只能移動(dòng)一個(gè)圓盤(pán)。

問(wèn)應(yīng)該如何操作?

玩法如下:

1.有三根桿子A,B,C。A桿上有若干碟子

2.每次移動(dòng)一塊碟子,小的只能疊在大的上面

3.把所有碟子從A桿全部移到C桿上

在這里插入圖片描述

在這里插入圖片描述

二、問(wèn)題分析

(兩步直接解決問(wèn)題)

1.第一步(先思考終止條件)

考慮n=1的情況:

在這里插入圖片描述

只需要把這個(gè)塊從A移到C即可。

在這里插入圖片描述

2.第二步(宏觀看待整個(gè)問(wèn)題)

當(dāng)n>=2時(shí),把如圖藍(lán)色框框想象成上面的n-1個(gè)塊(我把它稱(chēng)為一堆塊),紅色框框表示的是最下面的一塊(命名為底塊),這樣問(wèn)題可以簡(jiǎn)化為如圖所示的三步。

在這里插入圖片描述

第一步:先把上面的一堆塊 從A(起始柱子)移動(dòng)到B(目標(biāo)柱子)上,在這個(gè)過(guò)程中,C(輔助柱子)起到中轉(zhuǎn)的作用(因?yàn)轭}目要求移動(dòng)的過(guò)程中,小盤(pán)子要保證在大盤(pán)子上面)

第二步:把最下面的紅色大塊直接從A(起始柱子)移動(dòng)到C(目標(biāo)柱子)。這里注意,這一步的目標(biāo)柱子和第一步的不一樣。

第三步:把上面的一堆塊從B(起始柱子)移動(dòng)到C(目標(biāo)柱子)上,A(輔助柱子)起到中轉(zhuǎn)的作用。

三、解決方案

那么問(wèn)題就很簡(jiǎn)單了,遞歸的代碼就分為兩部分:終止條件和遞歸邏輯。

上一篇博客講到,我們思考遞歸問(wèn)題的時(shí)候,可以直接把這個(gè)大問(wèn)題拆解成很多個(gè)子問(wèn)題,想象這個(gè)功能別人已經(jīng)寫(xiě)好了(就是這個(gè)遞歸函數(shù)),我們做不到的功能直接調(diào)用這個(gè)遞歸函數(shù)就可以(注意邏輯)。

public class Recursion {
    public static void main(String[] args) {
        int n = 3;
        hanoiTower(n,'A','B','C');
    }

    /**
     * 傳入n個(gè)盤(pán)子,編號(hào)從1..n,我就能按照漢諾塔的規(guī)則,從目標(biāo)盤(pán)子A -> C ,B是輔助盤(pán)
     * @param nDisks
     * @param A 起始柱子
     * @param B 輔助柱子
     * @param C 目標(biāo)柱子
     */
    public static void hanoiTower(int nDisks,char A,char B,char C) {
        // 邊界
        if (nDisks == 1) {
            // 直接一步到位,用不到B,A上的這一個(gè)盤(pán)子從A -> C
            move(nDisks,A,C);
            return;
        }
        // n >= 2,核心步驟1,先把頂上的 n -1個(gè)小盤(pán)子從A -> B,C作為輔助
        hanoiTower(nDisks - 1,A,C,B);
        // 核心步驟2.此時(shí)A上就剩下第n個(gè)盤(pán)子,一步到位將最大的這個(gè)盤(pán)子一次移動(dòng)到C
        move(nDisks,A,C);
        // 核心步驟3.此時(shí)再把B上的這n-1個(gè)盤(pán)子從B -> C,A作為輔助
        hanoiTower(nDisks - 1,B,A,C);
    }

    /**
     * 將編號(hào)為n的盤(pán)子從sourceTower移動(dòng)到destTower
     * @param nDisks
     * @param sourceTower
     * @param destTower
     */
    public static void move(int nDisks, char sourceTower, char destTower) {
        System.out.println("編號(hào)為"+nDisks+"的盤(pán)子正在從"+sourceTower+"->"+destTower);
    }

四、示例

n=3的時(shí)候

在這里插入圖片描述

在這里插入圖片描述

以上就是用宏觀思維去進(jìn)行遞歸求解漢諾塔的方法,希望大家多多支持喲(●ˇ∀ˇ●)

到此這篇關(guān)于Java用遞歸方法解決漢諾塔問(wèn)題詳解的文章就介紹到這了,更多相關(guān)Java 漢諾塔內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springcloud使用Hystrix進(jìn)行微服務(wù)降級(jí)管理

    springcloud使用Hystrix進(jìn)行微服務(wù)降級(jí)管理

    這篇文章主要介紹了springcloud使用Hystrix進(jìn)行微服務(wù)降級(jí)管理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 淺談Springboot2.0防止XSS攻擊的幾種方式

    淺談Springboot2.0防止XSS攻擊的幾種方式

    本文主要介紹了Springboot2.0防止XSS攻擊的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • java獲取注冊(cè)ip實(shí)例

    java獲取注冊(cè)ip實(shí)例

    本文分享了java獲取注冊(cè)ip實(shí)例代碼,代碼簡(jiǎn)潔,具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧
    2016-12-12
  • 一文詳細(xì)講解Java的父子繼承、方法的重寫(xiě)與super關(guān)鍵字

    一文詳細(xì)講解Java的父子繼承、方法的重寫(xiě)與super關(guān)鍵字

    Java中繼承是通過(guò)extends關(guān)鍵字實(shí)現(xiàn),幫助減少代碼重復(fù),提高復(fù)用性,子類(lèi)繼承父類(lèi)的屬性和方法,但私有成員除外,方法重寫(xiě)(override)使子類(lèi)改造父類(lèi)方法以適應(yīng)新功能,這篇文章主要介紹了Java的父子繼承、方法的重寫(xiě)與super關(guān)鍵字的相關(guān)資料,需要的朋友可以參考下
    2024-10-10
  • 基于創(chuàng)建Web項(xiàng)目運(yùn)行時(shí)出錯(cuò)的解決方法(必看篇)

    基于創(chuàng)建Web項(xiàng)目運(yùn)行時(shí)出錯(cuò)的解決方法(必看篇)

    下面小編就為大家?guī)?lái)一篇基于創(chuàng)建Web項(xiàng)目運(yùn)行時(shí)出錯(cuò)的解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • 微服務(wù)領(lǐng)域Spring Boot自動(dòng)伸縮的實(shí)現(xiàn)方法

    微服務(wù)領(lǐng)域Spring Boot自動(dòng)伸縮的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于微服務(wù)領(lǐng)域Spring Boot自動(dòng)伸縮的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • SpringBoot整合Scala構(gòu)建Web服務(wù)的方法

    SpringBoot整合Scala構(gòu)建Web服務(wù)的方法

    這篇文章主要介紹了SpringBoot整合Scala構(gòu)建Web服務(wù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • SpringBoot中@Insert、@Update實(shí)現(xiàn)批量新增更新的使用示例

    SpringBoot中@Insert、@Update實(shí)現(xiàn)批量新增更新的使用示例

    本文主要介紹了SpringBoot中@Insert、@Update實(shí)現(xiàn)批量新增更新的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-10-10
  • 詳解SpringCloud使用Consul做注冊(cè)中心

    詳解SpringCloud使用Consul做注冊(cè)中心

    這篇文章主要介紹了SpringCloud使用Consul做注冊(cè)中心,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java單元測(cè)試Powermockito和Mockito使用總結(jié)

    Java單元測(cè)試Powermockito和Mockito使用總結(jié)

    公司單元測(cè)試框架選用了Junit 4.12,Mock框架選用了Mockito和PowerMock,本文主要介紹了Java單元測(cè)試Powermockito和Mockito使用總結(jié),感興趣的可以了解一下
    2021-09-09

最新評(píng)論

永善县| 鸡泽县| 沁源县| 宿松县| 阆中市| 黎平县| 伊宁县| 泰兴市| 青浦区| 四平市| 台北县| 和龙市| 乾安县| 德惠市| 开远市| 陆川县| 义乌市| 民和| 辽宁省| 巧家县| 松滋市| 达拉特旗| 巴彦县| 壶关县| 桑日县| 美姑县| 项城市| 太白县| 澄迈县| 大港区| 临沭县| 福贡县| 邢台县| 宁国市| 大足县| 酉阳| 鄂托克前旗| 武夷山市| 上饶市| 阿合奇县| 稻城县|