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

Java 細致圖解帶你分析漢諾塔

 更新時間:2022年03月23日 11:21:30   作者:來自爪哇的bean  
漢諾塔問題是一個經(jīng)典的問題。漢諾塔(Hanoi Tower),又稱河內(nèi)塔,源于印度一個古老傳說。本文將用Java求解這一問題,感興趣的可以學習一下

一、漢諾塔問題來源

漢諾塔(Tower of Hanoi),又稱河內(nèi)塔,是一個源于印度古老傳說的益智玩具。大梵天創(chuàng)造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規(guī)定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤

二、問題分析

從簡單問題開始

直接拿64個盤子來想,可能會比較難,我們可以先從1個盤子開始看,如下圖:

一個盤子

A -> C?

只有一個盤子情況下,我們可以直接將 A 柱子上面的盤子移到 C 柱子上

需要移動一次

兩個盤子

當有兩個盤子時,我們也可以通過下面方式實現(xiàn):

A -> B? ? ?A->C? ? ?B->C

需要移動3次

1.? A -> B

2.? A -> C

?3.? B -> C

?三個盤子

?當有三個盤子時,移動步驟如下:

A -> C? ? ?A -> B? ? ?C -> B? ? ?A -> C? ? ?B -> A? ? ?B -> C? ? ?A -> C

共需要移動7次?

?1.? A -> C

2.? A -> B

?3.? C -> B

4.? A -> C

?5.? B -> A

?6.? B -> C

?7.? A -> C

這就完成了3個盤子的移動

當有 4 個盤子時,這個問題其實就已經(jīng)很復雜了

規(guī)律推導

1個盤子? ? ? 移動1次

2個盤子? ? ? 移動3次

3個盤子? ? ? 移動7次

……

N 個盤子? ? 移動 2^N - 1 次

那么64個盤子就是需要移動 2^64 - 1 次

三、解決問題

我們可以通過遞歸來解決這個問題,獲得正確的移動方式

如果有N個盤子該怎么移動呢?

整體思路

我們可以先將 N?- 1 個盤子從 A 柱借助 C 柱移動到 B 柱,再將 A 柱剩下的一個盤子移動到 C柱,然后將 B 柱上的 N - 1 個盤子借助 A 柱移動到 C 柱,就完成了所有柱子的移動(中間具體移動過程暫不討論)

上代碼

public static void hanoi(int num, String src, String help, String dest) {
    if (num == 1) {     // 只有一個盤子的時候直接移動
        System.out.print(src + "->" + dest + "  ");  // 將一個盤子從源柱子挪到目標柱子
    } else {
        hanoi(num - 1, src, dest, help);   // 將n - 1個盤子從源柱子借助目標柱子挪到輔助柱子
        System.out.print(src + "->" + dest + "  ");  // 將一個盤子從源柱子挪到目標柱子
        hanoi(num - 1, help, src, dest);  // 將輔助柱子上n - 1個盤子借助源柱子挪到目標柱子
    }
}
public static void main(String[] args) {
    hanoi(3, "A", "B", "C");
}

這段代碼中 src 是源柱子,help是輔助柱子,dest 是目標柱子

這是一個二路遞歸

運行結(jié)果:

?這就成功完成了盤子的移動

四、婆羅門能否完成大梵天的任務

移動 64 個盤子需要多長時間

在這里我們假設(shè)婆羅門的人都非常聰明,不需要思考就直接能知道正確的移動方法,移動一個盤子需要一秒鐘,一直不停的移

將2^64 - 1秒換算為年約為5849 4241 7355年(5849.42億年),而地球存在至今不過45億年,太陽系的預期壽命據(jù)說也就是數(shù)百億年。真的過了5849.42億年,不說太陽系和銀河系,至少地球上的一切生命,連同梵塔、廟宇等,都早已經(jīng)灰飛煙滅。

相關(guān)預言

有預言說,這件事完成時宇宙會在一瞬間閃電式毀滅。也有人相信婆羅門至今還在一刻不停地搬動著圓盤

計算機移動64個盤子需要多長時間 ?

我的電腦核心頻率為2.90GHz,也就是每秒鐘運算 29 億次,那么移動 2^64 - 1次需要的時間約為201年

到此這篇關(guān)于Java 細致圖解帶你分析漢諾塔的文章就介紹到這了,更多相關(guān)Java 漢諾塔內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis-Plus中and()和or()的使用與原理詳解

    Mybatis-Plus中and()和or()的使用與原理詳解

    最近發(fā)現(xiàn)MyBatisPlus還是挺好用的,下面這篇文章主要給大家介紹了關(guān)于Mybatis-Plus中and()和or()的使用與原理的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Spring七大組件是哪些以及作用

    Spring七大組件是哪些以及作用

    這篇文章主要介紹了Spring七大組件是哪些以及作用,幫助剛接觸spring的朋友更快理解,如果有說的不對的地方還請指正,需要的朋友可以參考下
    2023-03-03
  • Java接口和抽象類原理詳解

    Java接口和抽象類原理詳解

    這篇文章主要介紹了Java接口和抽象類原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Java基于Rest?Assured自動化測試接口詳解

    Java基于Rest?Assured自動化測試接口詳解

    Rest Assured 是一個基于 Java 的流行的用于測試 RESTful API 的庫。這篇文章主要介紹了Java如何基于Rest?Assured實現(xiàn)自動化測試接口,需要的可以參考一下
    2023-03-03
  • SpringAOP實現(xiàn)自定義接口權(quán)限控制

    SpringAOP實現(xiàn)自定義接口權(quán)限控制

    本文主要介紹了SpringAOP實現(xiàn)自定義接口權(quán)限控制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-11-11
  • 詳解IntelliJ IDEA創(chuàng)建spark項目的兩種方式

    詳解IntelliJ IDEA創(chuàng)建spark項目的兩種方式

    這篇文章主要介紹了詳解IntelliJ IDEA創(chuàng)建spark項目的兩種方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Spring?Validation參數(shù)效驗的各種使用姿勢總結(jié)

    Spring?Validation參數(shù)效驗的各種使用姿勢總結(jié)

    在實際項目中經(jīng)常需要對前段傳來的數(shù)據(jù)進行校驗,下面這篇文章主要給大家介紹了關(guān)于Spring?Validation參數(shù)效驗的各種使用姿勢,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • Hibernate hql查詢代碼實例

    Hibernate hql查詢代碼實例

    這篇文章主要介紹了Hibernate hql查詢代碼實例,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • 解決spring boot啟動掃描不到自定義注解的問題

    解決spring boot啟動掃描不到自定義注解的問題

    這篇文章主要介紹了解決spring boot啟動掃描不到自定義注解的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • javaweb實現(xiàn)在線支付功能

    javaweb實現(xiàn)在線支付功能

    這篇文章主要為大家詳細介紹了javaweb實現(xiàn)在線支付功能的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11

最新評論

桂东县| 团风县| 察哈| 方山县| 岱山县| 溧水县| 建水县| 特克斯县| 巧家县| 迁西县| 如东县| 堆龙德庆县| 阿巴嘎旗| 肥东县| 江陵县| 道孚县| 雅江县| 邹城市| 增城市| 东源县| 乐业县| 兴宁市| 文登市| 莲花县| 浮梁县| 辽阳市| 清徐县| 晋中市| 洛隆县| 巴南区| 平原县| 山丹县| 东兰县| 察雅县| 安平县| 云林县| 称多县| 莲花县| 宝兴县| 永春县| 古浪县|