欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

博主之前有寫過關于遞歸問題的思維模式:

遞歸的思路

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

一、問題描述

漢諾塔(又稱河內塔)問題是源于印度一個古老傳說。大梵天創(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(輔助柱子)起到中轉的作用(因為題目要求移動的過程中,小盤子要保證在大盤子上面)

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

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

三、解決方案

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

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

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的時候

在這里插入圖片描述

在這里插入圖片描述

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

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

相關文章

  • 詳解Java Web如何限制訪問的IP的兩種方法

    詳解Java Web如何限制訪問的IP的兩種方法

    這篇文章主要介紹了詳解Java Web如何限制訪問的IP的兩種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Spring mvc Controller和RestFul原理解析

    Spring mvc Controller和RestFul原理解析

    這篇文章主要介紹了Spring mvc Controller和RestFul原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Java面向對象之包裝類的用途與實際使用

    Java面向對象之包裝類的用途與實際使用

    所謂包裝類,就是能夠直接將簡單類型的變量表示為一個類,在執(zhí)行變量類型的相互轉換時,我們會大量使用這些包裝類,本文我們來深入探索一下Java包裝類的相關內容,需要的朋友可以參考下
    2022-03-03
  • Java實現(xiàn)調用MySQL存儲過程詳解

    Java實現(xiàn)調用MySQL存儲過程詳解

    相信大家都知道存儲過程是在大型數據庫系統(tǒng)中,一組為了完成特定功能的SQL語句集。存儲過程是數據庫中的一個重要對象,任何一個設計良好的數據庫應用程序都應該用到存儲過程。Java調用mysql存儲過程,實現(xiàn)如下,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-11-11
  • java類比C++的STL庫詳解

    java類比C++的STL庫詳解

    這篇文章主要介紹了java類比C++的STL庫詳解,標準模板庫,是C++標準庫的重要組成部分,中文可譯為標準模板庫或者泛型庫,其包含有大量的模板類和模板函數,STL 是一些容器、算法和其他一些組件的集合,需要的朋友可以參考下
    2023-08-08
  • Java實現(xiàn)LRU緩存的實例詳解

    Java實現(xiàn)LRU緩存的實例詳解

    這篇文章主要介紹了Java實現(xiàn)LRU緩存的實例詳解的相關資料,這里提供實例幫助大家理解掌握這部分內容,需要的朋友可以參考下
    2017-08-08
  • Java面試題沖刺第十一天--集合框架篇(2)

    Java面試題沖刺第十一天--集合框架篇(2)

    這篇文章主要為大家分享了最有價值的兩道集合框架的面試題,涵蓋內容全面,包括數據結構和算法相關的題目、經典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 實例分析java開啟線程的方法

    實例分析java開啟線程的方法

    在本文里我們通過實例給大家講解了JAVA開啟線程的方法和相關知識點,需要的朋友們跟著學習下。
    2019-03-03
  • spring boot整合shiro安全框架過程解析

    spring boot整合shiro安全框架過程解析

    這篇文章主要介紹了spring boot整合shiro安全框架過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 基于SpringBoot+vue實現(xiàn)前后端數據加解密

    基于SpringBoot+vue實現(xiàn)前后端數據加解密

    這篇文章主要給大家介紹了基于SpringBoot+vue實現(xiàn)前后端數據加解密,文中有詳細的示例代碼,具有一定的參考價值,感興趣的小伙伴可以自己動手試一試
    2023-08-08

最新評論