一起玩轉漢諾塔

2021-03-01 產品人小王

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

後來,這個傳說就演變為漢諾塔遊戲,玩法如下:

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

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

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

分析:


如果n=1,則將圓盤從A直接移動到C。
如果n=2,則:
1.將A上的n-1(等於1)個圓盤移到B上;
2.再將A上的一個圓盤移到C上;
3.最後將B上的n-1(等於1)個圓盤移到C上。
  如果n=3,則:
A. 將A上的n-1(等於2,令其為n`)個圓盤移到B(藉助於C),步驟如下:
(1)將A上的n`-1(等於1)個圓盤移到C上。
(2)將A上的一個圓盤移到B。
(3)將C上的n`-1(等於1)個圓盤移到B。
B. 將A上的一個圓盤移到C。
C. 將B上的n-1(等於2,令其為n`)個圓盤移到C(藉助A),步驟如下:
(1)將B上的n`-1(等於1)個圓盤移到A。
(2)將B上的一個盤子移到C。
(3)將A上的n`-1(等於1)個圓盤移到C。
   到此,完成了三個圓盤的移動過程。
    從上面分析可以看出,當n大於等於2時,移動的過程可分解為三個步驟:
第一步  把A上的n-1個圓盤移到B上;
第二步  把A上的一個圓盤移到C上;
第三步  把B上的n-1個圓盤移到C上;其中第一步和第三步是類同的。

也許你已經發現規律了,即每次都是先將其他圓盤移動到輔助柱子上,並將最底下的圓盤移到c柱子上,然後再把原先的柱子作為輔助柱子,並重複此過程。

這個過程稱為遞歸,即定義一組基本操作,這組操作將規模小一點(或大一點)的操作當做一個整體——無需關心它的細節,只當它已經完成了——然後執行剩下的操作。而在更小或更大的規模中也依此操作,直到規模達到預定值

在數學上,有些公式就是採用遞歸的方式定義的。例如階乘和斐波那契數列(Fibonacci Sequence)。前者的公式為:

規定0!=1!=1,對於n>=2,有n!=n*(n-1)!

這裡的n-1就是比n規模略小的階乘,而1就是規模的最小值(預定值)(0是作為特殊值而專門規定的)。

著名的斐波那契數列定義如下,可以看出,f(n)是由規模更小一些的f(n-1)和f(n-2)推導出來的:

f(0)=0,f(1)=1
f(n)=f(n-1)+f(n-2) (n>=2)

因此,遞歸實際上就是用自己來定義自己。

回到前面漢諾塔的問題上來。我們假設函數func(n, a, b, c)用於將n個圓盤由a移動到c,b作為輔助柱子。那麼我們可以這樣實現這個遞歸過程:

func:
if n!=0 then
;預定值 func(n-1, a, c, b)
;將n-1個盤子由a移動到b,以c為輔助柱子
(注意參數順序) move a[n] to c
;將a上的最後一個盤子移動到c func(n-1, b, a, c)
;將n-1個盤子由b移動到c,以a為輔助柱子

endif
;完成

java代碼實現

import java.util.Scanner;

public class ddd{
    static int count=1;//用來記錄生成步驟的條數
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner s=new Scanner(System.in);
        int n=s.nextInt();
        move(n,"A","B","C");
    }
    /**
     * 將n個盤子從A移到B,C作為輔助的柱子
     * @param n 原來有多少個盤
     * @param A 原來放置盤子的柱子
     * @param B B柱子
     * @param C C柱子
     */
    public static void move(int n,String A,String B,String C) {
        if(n==1){
            System.out.println("第"+count+++"步:"+"將第1個盤從"+A+"移到"+B);
        }
            else{
            move(n-1,A,C,B);
            System.out.println("第"+count+++"步:"+"將第"+n+"個盤從"+A+"移到"+B);
            move(n-1,C,B,A);
        }
    };
        }


python代碼實現

def move(n, a, b, c):
if n==1:
        print (a,'-->',c)
        return
    else:
        # 首先需要把 (N-1) 個圓盤移動到 b
        move(n-1,a,c,b)
        # 將a的最後一個圓盤移動到c
        move(1,a,b,c)
        # 再將b的(N-1)個圓盤移動到c
        move(n-1,b,a,c)  
move(4, 'A', 'B', 'C')

詳細解釋:

def move(n, a, b, c):
if n==1:
        print (a,'-->',c)
        return
    else:
        # 首先需要把 (N-1) 個圓盤移動到 b
        move(n-1,a,c,b)
        # 將a的最後一個圓盤移動到c
        move(1,a,b,c)
        # 再將b的(N-1)個圓盤移動到c
        move(n-1,b,a,c)  
move(4, 'A', 'B', 'C')'''
我把3個盤子的漢諾塔全部通過代碼演示,
按縮進原則,每一個縮進即進一個遞歸函數,
每列印一次即中止當前遞歸,也就是每個print
說明:
 1.n = 3, n = 2, n = 1
 是每次執行if(n == 1)的結果,
 這裡就不寫判斷了,相信大家也能看懂,
 也就是n不等與1時就減1進入遞歸
 2.請注意a,b,c柱每次進入函數的順序,
 不要被形參帶錯路了,看準每次函數參數的實參
'''
move(3, "a", "b", "c")
n=3:
 #開始從a上移動n-1即2個盤子通過c移動到b,
 #以騰出c供a最後一個盤子移動
   move(2, "a","c","b")
  n=2:
 #開始進行n=2的一個遞歸,
 #把當前a('a')柱上的n-1個盤子
 通過c('b')移動到b('c')
   move(1, "a", "b", "c")
  n=1:
 #n=2的第一個遞歸完成,列印結果,
 #執行當前子函數剩餘代碼
     print("a", "->", "c")
    move(1, "a", "c", "b")
  n=1:
       print("a", "->", "b")
    move(1, "c", "a", "b")
  n=1:
       print("c", "->", "b")
#到這裡完成了a柱上面的n-1即是2個盤子的移動
#開始把a柱上最後一個盤子移動到c柱上
   move(1, "a", "b", "c")
  n=1:
       print("a", "->", "c")
#到這裡完成移動a柱上的最後一個盤子到c柱上
   move(2, "b", "a", "c")
  n=2:
#開始進行n=2的第二個遞歸,
# 即把當前b('b')的盤子(n-1個)
# 通過a('a')移動到c('c')上
   move(1, "b", "c", "a")
   n=1:
#n=2 的第二個遞歸完成,
# 列印結果並執行當前子函數的剩餘代碼
     print("b", "->", "a")
    move(1, "b", "a", "c")
   n=1:
       print("b", "->", "c")
    move(1, "a", "b", "c")
   n=1:
       print("a", "->", "c")
# 到這裡把b上的盤子通過a移


擴展:漢諾塔問題的非遞歸實現

這種算法看得我頭疼,直接傳送門吧

https://tieba.baidu.com/f?kz=1255166419&red_tag=3546780199

知識重在總結和梳理,只有不斷地去學習並運用,才能化為自己的東西。由於本人進階猿類時間尚短,故此公眾號即是我學習,工作的筆記,也是和大家交流,相互提升技術的平臺,希望大家不吝賜教。

相關焦點

  • 漢諾塔的神秘步伐
    快問快答:漢諾塔什麼形狀?
  • 數學奧秘——漢諾塔的秘密
    今天帶來了一個有趣的數學思維遊戲——漢諾塔遊戲。相傳神創造了3根杆子,就有了這個遊戲,分別是起始杆、過渡杆和目標杆,起始杆上擺放著大小不同的圓盤。其中起始杆上擺放一個圓盤表示第一關,擺放兩個圓盤表示第二關,擺放三個圓盤表示第三關,依次類推。
  • 64階漢諾塔完成需要5800億年?手寫一個漢諾塔遞歸算法
    漢諾塔是一個非常經典的數學模型,它有一個古老的傳說。相傳印度主神大梵天在創造世界的同時,也造了三根金剛石柱子。其中一根柱子上放著64個大小均不相同的圓盤。大梵天命令婆羅門將這64個圓盤按照從大到小的順序移動到另一根柱子上,在移動的過程中始終要保持大盤在下,小盤子在上。
  • 啟迪智慧的漢諾塔遊戲
    1883年法國的數學家 Edouard Lucas(愛德華·盧卡斯) 提出漢諾塔問題。這個小小的遊戲裡邊包含著巨大的數學智慧,塔遊戲中蘊藏著豐富的數學思想方法:包括分類討論的思想與方法、最優化選擇的方法、數學歸納的方法、數學遞歸的思想等,因此 ,玩好漢諾塔遊戲不僅可以從中獲得快樂 ,還能夠學到許多數學知識 。
  • 畢業生求職必會算法 漢諾塔
    漢諾塔:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。二、漢諾塔移動過程漢諾塔動畫: 演示圓盤移動過程(此動圖來源於網絡)下面分三種情況分別演示每個盤子的移動過程(n 代表圓盤數量):1個圓盤的情況:
  • 荒野日記漢諾塔怎麼玩
    本次給大家帶來的是荒野日記中的漢諾塔,漢諾塔如果過不去的話就會沒辦法通過遺蹟,這裡就給大家講解一下,卡關的玩家可以看一下,希望能夠幫助到各位玩家~下面就一起來看看吧! 本次給大家帶來的是荒野日記中的漢諾塔,漢諾塔如果過不去的話就會沒辦法通過遺蹟
  • 關於漢諾塔的步驟
    畫之前,我們先了解一個有趣的問題~如何理解漢諾塔到底幾個步驟的問題?看看熱心知友的回覆漢諾塔永遠只有三步:ok,進入教程。準備工具:尺子,鉛筆,剪刀。先來看效果圖:▼第一步:我們用尺子劃分好由小到大的格子。
  • 簡單又常見的算法題:漢諾塔
    (給算法愛好者加星標,修煉編程內功)來源:山大王wld算法題儘量做到難易結合,在我們看一些難題的時候偶爾也可以看一些非常簡單又非常容易看懂的題,要不然算法題一直看不懂,容易打擊大家的興趣,今天來看一道非常簡單又非常常見的算法題,就是漢諾塔問題
  • 漢諾塔遊戲:遞歸經典問題
    漢諾塔遊戲,是非常著名的智力趣味題,在很多算法書籍和智力競賽中都有涉及。
  • 強迫症玩家的最愛 書本漢諾塔讓一切歸於有序
    漢諾塔是一種非常古老的益智遊戲,小編在很小的時候就接觸過這種遊戲,對這類遊戲雖談不上喜歡,但卻有著很深刻的印象,今天小編就為大家帶來就是一款名為書本漢諾塔的休閒益智遊戲,遊戲好不好,大家看過評測就知道了。
  • C語言+EasyX庫:漢諾塔移動動畫
    漢諾塔(又稱河內塔)是一款源於印度一個古老傳說的益智類遊戲。傳說上帝創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著7片黃金圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。遊戲裡有三根金剛石柱子,在一根柱子上從下往上按大小順序摞著7片黃金圓盤。
  • 漢諾塔——我其實還在第一層
    漢諾塔問題描述假設有3個分別命名為A,B,C的塔座,在塔座A上插有n個直徑大小各不相同,依小從大編號為1,2,........,n的圓盤。
  • 漢諾塔拓展項目
    漢諾塔拓展項目項目簡介:這是一個考驗集體智慧的項目,根據要求,學員需在規定時間內將漢諾塔從A區移到C區。這個項目能訓練團隊合作解決問題的能力;讓學員學會用不用的角度思考問題;診斷學員的個性特徵;提升團隊間的溝通能力。
  • 一起玩轉科學問題
  • 漢諾塔遊戲完整版
    遊戲的名字,最通俗的叫法是漢諾塔,英文名Tower of Hanoi。Hanoi在英文裡是河內(越南首都)的意思,所以,其實還是叫河內塔更準確些。梵天神告訴侍奉他的婆羅門(祭司),要藉助一根柱子做中介,來把這64個圓盤一起移動到另一根柱子上;規則和上面說的一樣,在三根柱子間一次只能移動一個圓盤,而且大圓盤不能放在小圓盤之上。梵天大神說了,只要你們能實現最終的目標,世界就會在一個閃電中毀滅。
  • 漢諾塔TowerOfHanoi 工作學習之餘娛樂一番
    漢諾塔(又稱河內塔)是一款WP7平臺上源於印度一個古老傳說的益智類遊戲。傳說上帝創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片黃金圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。
  • 跟DK一起找尋規律,玩轉數學!
    我在搜尋數學啟蒙書籍的期間,發現了一套有趣的圖書,它就是英國DK出版公司出版的《DK超級數學小玩家》(全套分兩冊,分別是《DK超級數學小玩家:玩轉乘法》和《DK超級數學小玩家:玩轉測量》),這是一套適合學前班到小學二年級的數學啟蒙書。DK出版社於1974年成立於英國倫敦,作為企鵝蘭登書屋出版集團旗下極具競爭力的品牌之一,DK以專業的內容和鮮明的視覺設計不斷引領著國際圖文書的出版風格。
  • 你會玩漢諾塔嗎?——讓遞歸算法來幫你,只需「3步」
    調用我們編寫的函數來驗證一下:漢諾塔我們再來看一個遞歸的實際應用——漢諾塔遊戲。如上圖所示,有3跟杆子A、B、C,其中A上有大小不一的3個圓環,越在下面的圓環越大。我們的目標是,按照現在的順序把3個圓盤從A挪到C。其中,有2個規則限制:1.每次只能移動一個圓盤。2.大的圓盤不能放在小的圓盤上面。
  • 彩虹系列科學小實驗,和孩子一起玩轉色彩
    下面我們繼續來玩轉色彩吧。想要了解更多創意實驗,請關注我哦!彩虹塔小朋友聽過雞尾酒麼?雞尾酒(cocktail)是一種混合飲品,是由兩種或兩種以上的酒或飲料、果汁、汽水混合而成,會呈現出不同繽紛的顏色,非常漂亮。我們就自己動手做一杯像雞尾酒一樣的彩虹塔吧。
  • 校園玩轉科技 點亮孩子們的「科技夢」
    科技節以「玩轉科技,走近夢想」為主題,主要包括炫彩開幕式、科技嘉年華體驗活動、科創成果展、科創個人挑戰賽、分班競賽活動等多個板塊,吸引著全校3000多名學生積極參與。力求通過各種方式讓學生了解和感受科技發展的最新動態,組織和參與各項科技創新體驗活動,運用所學科學原理解決實際問題,提高全體學生的科學素養和科創意識。