畢業生求職必會算法 漢諾塔

2021-01-14 極客學院

一、什麼是漢諾塔

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

二、漢諾塔移動過程

漢諾塔動畫: 演示圓盤移動過程(此動圖來源於網絡)

下面分三種情況分別演示每個盤子的移動過程(n 代表圓盤數量):

1個圓盤的情況:

2個圓盤的情況:

3個圓盤的情況:

三、漢諾塔算法思想

當 n 等於 1 的時候,直接把圓盤從 A 移動到 C;

當 n > 1 的時候:

把 A 柱子上面的 (n-1) 個盤子,從 A 移動到 B;

把 A 柱子上面的第 n 個盤子由 A 移動到 C;

把第一步 B 柱子上的 (n-1) 個盤子由 B 移動到 C

在算法的實現過程中,我們利用遞歸的思想。來模擬移動過程以及總共移動的次數。

1.示例代碼
public class Hanoi {

    /**
     * 移動的次數
     */
    static int m = 0;

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("玩漢諾塔,請輸入圓盤的個數:");
        int n = input.nextInt();
        char a = 'A';
        char b = 'B';
        char c = 'C';
        
        hanoi(n, a, b, c);
        
        System.out.println("把A上的圓盤都移動到了C上,總共移動了" + m + "次。");
    }

    /**
     * 漢諾塔
     *
     * @param n 盤子的數量
     * @param a 柱子 A
     * @param b 柱子 B
     * @param c 柱子 C
     */
    public static void hanoi(int n, char a, char b, char c) {
        if (n == 1) {
            move(1, a, c);
        } else {
            // 遞歸 把A柱子上面的n-1層,從A,經C,到B
            hanoi(n - 1, a, c, b);
            move(n, a, c);
            // 遞歸 把B柱子上的n-1層,從B,經A,到C
            hanoi(n - 1, b, a, c);
        }
    }

    /**
     * 移動
     *
     * @param n 圓盤的個數
     * @param i 移動前的位置
     * @param j 移動後的位置
     */
    public static void move(int n, char i, char j) {
        m++;
        System.out.println("第" + m + "次: " + n + "號圓盤: " + i + " -> " + j);
    }
}

代碼執行結果:

玩漢諾塔,請輸入圓盤的個數:3
第1次: 1號圓盤: A -> C
第2次: 2號圓盤: A -> B
第3次: 1號圓盤: C -> B
第4次: 3號圓盤: A -> C
第5次: 1號圓盤: B -> A
第6次: 2號圓盤: B -> C
第7次: 1號圓盤: A -> C
把A上的圓盤都移動到了C上,總共移動了7次。

2.延伸問題

如果移動一個圓盤需要1秒鐘的話,等到64個圓盤全部重新落在一起,需要多少長時間?

1個圓盤的時候,2的1次方減12個圓盤的時候,2的2次方減13個圓盤的時候,2的3次方減14個圓盤的時候,2的4次方減1........n個圓盤的時候,2的n次方減1

當 n=64的時候是(2的64次方減1)次。

代碼示例:

public class Test {
    public static void main(String[] args) {
        double a = Math.pow(2, 64) - 1;
        System.out.println("2^64-1的值: " + a);
        // 移動一個圓盤需要1秒,一年可以移動b個圓盤
        double b = 60 * 60 * 24 * 365;
        System.out.println("一年時間移動圓盤的個數: " + b);
        // 移動64個圓盤需要的時間
        double time = a / b;
        System.out.println("移動64個圓盤需要的時間: " + time + " 年");
    }
}

代碼執行結果:

2^64-1的值: 1.8446744073709552E19
一年時間移動圓盤的個數: 3.1536E7
移動64個圓盤需要的時間: 5.84942417355072E11 年

移動完所有的圓盤大概需要5849億年,這是一個多麼可怕的數字!

相關焦點

  • 64階漢諾塔完成需要5800億年?手寫一個漢諾塔遞歸算法
    這就是最早關於漢諾塔的古老傳說。這其實是一種時間的象徵,因為按照這個規則,將64個圓盤移動到另一個圓柱上,在時間上來說幾乎是不可能的,需要的時間可能比宇宙誕生的時間還要長,具體為什麼?文章會為大家詳細說明。我們首先將這個遊戲簡化。我們設定有A、B、C三根柱子,A柱子上從下往上放的是從大到小依次排好順序的盤子,B和C柱子是空的。
  • 簡單又常見的算法題:漢諾塔
    ,修煉編程內功)來源:山大王wld算法題儘量做到難易結合,在我們看一些難題的時候偶爾也可以看一些非常簡單又非常容易看懂的題,要不然算法題一直看不懂,容易打擊大家的興趣,今天來看一道非常簡單又非常常見的算法題,就是漢諾塔問題,這道題我想只要是學過編程的同學都應該知道的。
  • 畢業生求職怎樣避坑?會有哪些坑人的單位?
    相當一部分大學畢業生已經開始了自己的求職之旅,今年受疫情的影響,就業環境並不足夠樂觀2020年就業壓力非常大,各個高校已經在校內開展各種大型招聘會,政府也發揮作用力求保證畢業生的工作機會,但還是有一部分畢業生沒有找到合適的工作。
  • TalkingData發布2020年高校畢業生求職研究報告
    近日,TalkingData發布《2020年高校畢業生求職研究報告》(以下簡稱為《報告》),對2020年高校畢業生求職行為及求職心態進行全面調研,全面解析當代高校畢業生的求職需求,從市場環境和人群畫像等維度解構當代高校畢業生的求職偏好及未來求職趨勢。
  • 你會玩漢諾塔嗎?——讓遞歸算法來幫你,只需「3步」
    今天我們來介紹一種很常見的算法——遞歸。遞歸函數什麼是遞歸?簡單的說,遞歸就是通過不斷調用自己,來完成不斷循環的一個過程。可能概念有些拗口,我們編寫一個遞歸函數來說明。斐波那契數列大家都知道,它從第三項開始,每一項都是前面兩項的和:1,1,2,3,5,8,13,21......
  • 求職中招 高三畢業生遭遇「暑期第一課」
    第1眼-重慶廣電消息,剛剛完成高考的高三畢業生們,成為了暑期兼職的主力軍。少數職業中介公司瞄上了這些涉世不深的年輕人,給他們好好上了一堂開學前的一課。小劉是高三應屆畢業生。卸下學業重擔的他準備打份短工,豐富社會經驗,掙點零花錢。7月中旬,他通過58同城網站發出了求職信息,尋找工資一日一結算的工作。一家名為栩源勝的公司聯繫上了他,願意提供就業機會。
  • 漢諾塔遊戲:遞歸經典問題
    漢諾塔遊戲,是非常著名的智力趣味題,在很多算法書籍和智力競賽中都有涉及。
  • 漢諾塔的神秘步伐
    快問快答:漢諾塔什麼形狀?
  • 一起玩轉漢諾塔
    漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。
  • 啟迪智慧的漢諾塔遊戲
    1883年法國的數學家 Edouard Lucas(愛德華·盧卡斯) 提出漢諾塔問題。這個小小的遊戲裡邊包含著巨大的數學智慧,塔遊戲中蘊藏著豐富的數學思想方法:包括分類討論的思想與方法、最優化選擇的方法、數學歸納的方法、數學遞歸的思想等,因此 ,玩好漢諾塔遊戲不僅可以從中獲得快樂 ,還能夠學到許多數學知識 。
  • 「求職提問箱」網際網路求職流程簡析——阿里巴巴
    求職提問箱-從求職問題倒推求職方法,你的求職工具書。「我想求職網際網路,能給我講講嗎?」今天為大家帶來的阿里巴巴校招求職全解析,以下時間和安排為2020屆校園招聘安排,即將到來的2021屆校園招聘或許會有小變動,請以最新的校園招聘為準。
  • 途鴿求職一站式求職服務,幫助留學生提升求職技能與職場素質
    隨著海歸學子人數不斷增長,國內高校應屆畢業生逐年增加,導致國內就業壓力增大,留學生已逐漸告別「留學紅利」,歸國就業難題也逐漸增多。在國內就業人數不斷增長這一新趨勢下,海歸學子不了解國內各行業發展現狀、不熟悉求職流程與考察重點,與國內畢業生相比,求職處境同樣艱難。
  • 荒野日記漢諾塔怎麼玩
    本次給大家帶來的是荒野日記中的漢諾塔,漢諾塔如果過不去的話就會沒辦法通過遺蹟,這裡就給大家講解一下,卡關的玩家可以看一下,希望能夠幫助到各位玩家~下面就一起來看看吧! 本次給大家帶來的是荒野日記中的漢諾塔,漢諾塔如果過不去的話就會沒辦法通過遺蹟
  • 寧波近4萬名畢業生求職 主動曬待遇的企業不少
    浙江在線01月24日訊高校畢業生眼下正馬不停蹄地找工作。對人生的第一份工作,應屆高校畢業生希望有多少月薪?求職過程中,他們最缺什麼?為更好地了解職場準新人的就業狀況,本報聯合寧波市人事局、寧波大學、寧波工程學院等在甬高校,在1200名應屆高校畢業生中開展了專項調查,共收回有效問卷1017份。
  • 數學奧秘——漢諾塔的秘密
    今天帶來了一個有趣的數學思維遊戲——漢諾塔遊戲。相傳神創造了3根杆子,就有了這個遊戲,分別是起始杆、過渡杆和目標杆,起始杆上擺放著大小不同的圓盤。其中起始杆上擺放一個圓盤表示第一關,擺放兩個圓盤表示第二關,擺放三個圓盤表示第三關,依次類推。
  • 關於漢諾塔的步驟
    畫之前,我們先了解一個有趣的問題~如何理解漢諾塔到底幾個步驟的問題?看看熱心知友的回覆漢諾塔永遠只有三步:ok,進入教程。準備工具:尺子,鉛筆,剪刀。先來看效果圖:▼第一步:我們用尺子劃分好由小到大的格子。
  • 求職面試英語情景對話必會:詢問個人能力
    新東方網>英語>英語學習>職場英語>面試英語>正文求職面試英語情景對話必會:詢問個人能力 2015-08-04 14:09 來源:網絡 作者:
  • 強迫症玩家的最愛 書本漢諾塔讓一切歸於有序
    漢諾塔是一種非常古老的益智遊戲,小編在很小的時候就接觸過這種遊戲,對這類遊戲雖談不上喜歡,但卻有著很深刻的印象,今天小編就為大家帶來就是一款名為書本漢諾塔的休閒益智遊戲,遊戲好不好,大家看過評測就知道了。
  • RU應屆畢業生2019年薪排名,你拖後腿了麼?
    在提高班課程學習期間,該名學員的學習態度一直非常積極,有任何不明白的內容,都能夠隨時與老師溝通,除了能夠完成老師布置的必做作業之外,還會花費時間完成選做作業,自我練習。通過課程學習,在短短兩個月時間,對於求職面試的內容便已有了較為全面的掌握。
  • 臺大校長李嗣涔寄信給全校畢業生 提"求職準則"引網友激辯
    人民網5月24日電 畢業季將至,不少新鮮人即將出社會求職,日前,臺大校長李嗣涔更是寄信給全校畢業生,提醒他們找工作時「別太在乎薪水」、「不要太在意『準時上下班』」。不過,這些「找工作準則」被PO上網後,引發兩方激烈的辯論,有人痛批校方竟跟資方一起「奴化」員工,也有人認為,臺大生的確比較「傲」,提醒一下也好。