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

Java用遞歸方法解決漢諾塔問題詳解

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

前言

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

遞歸的思路

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

一、問題描述

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

大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。

并且規(guī)定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。

問應該如何操作?

玩法如下:

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

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

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

在這里插入圖片描述

在這里插入圖片描述

二、問題分析

(兩步直接解決問題)

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

考慮n=1的情況:

在這里插入圖片描述

只需要把這個塊從A移到C即可。

在這里插入圖片描述

2.第二步(宏觀看待整個問題)

當n>=2時,把如圖藍色框框想象成上面的n-1個塊(我把它稱為一堆塊),紅色框框表示的是最下面的一塊(命名為底塊),這樣問題可以簡化為如圖所示的三步。

在這里插入圖片描述

第一步:先把上面的一堆塊 從A(起始柱子)移動到B(目標柱子)上,在這個過程中,C(輔助柱子)起到中轉(zhuǎn)的作用(因為題目要求移動的過程中,小盤子要保證在大盤子上面)

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

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

三、解決方案

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

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

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

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

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

四、示例

n=3的時候

在這里插入圖片描述

在這里插入圖片描述

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

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

相關(guān)文章

  • springcloud使用Hystrix進行微服務降級管理

    springcloud使用Hystrix進行微服務降級管理

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

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

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

    java獲取注冊ip實例

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

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

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

    基于創(chuàng)建Web項目運行時出錯的解決方法(必看篇)

    下面小編就為大家?guī)硪黄趧?chuàng)建Web項目運行時出錯的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 微服務領(lǐng)域Spring Boot自動伸縮的實現(xiàn)方法

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

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

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

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

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

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

    詳解SpringCloud使用Consul做注冊中心

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

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

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

最新評論

河源市| 闵行区| 龙里县| 营口市| 芦溪县| 民权县| 通城县| 阿荣旗| 石嘴山市| 营口市| 交城县| 乌恰县| 深圳市| 江都市| 永济市| 江安县| 平潭县| 连山| 梁平县| 汾西县| 鲁甸县| 孟津县| 托克逊县| 雅江县| 中超| 钟祥市| 图木舒克市| 蓝田县| 新津县| 曲靖市| 通河县| 定边县| 桓台县| 曲松县| 大兴区| 潍坊市| 华蓥市| 龙里县| 泾阳县| 兰州市| 盘锦市|