經典算法:漢諾塔

學編程,學IT,算法也是必不可缺的,這一次給你們帶來一個經典的遞歸算法題,漢諾塔。算是算法的入門小題目之一吧~前端

視頻教程

什麼是漢諾塔?

我這裏直接拉來一個圖解釋一下(掛了請聯繫我)
Image text
就是這麼一個東西了,把全部的圓盤從左邊移動到右邊,而且大的圓盤不可以壓住小的。怎麼才能完成呢?java

規則理解了,開始鑽牛角尖

先來看看只有一個圓盤的狀況,python

嗯 至關的簡單 A--->C 就能夠了golang

兩個的狀況呢? 也不難 A--->B A--->C B--->C算法

三個的話有點挑戰了 你們本身推一推編程

好的 十個呢?就算想了半天弄好了,怎麼讓程序幫咱們作呢?頭大!微信

牛角尖鑽完了,冷靜分析

在咱們每次距離對稱最近的狀態,都是把最大的圓盤放到了最右邊,剩下的圓盤放到了中間。
Image text
而後把中間的再都放到右邊就行了測試

這道理就跟把大象裝冰箱同樣啊 都是三步呢!spa

這時候千萬不要去想怎麼把n-1層都搬到B柱 也不要想怎麼把N-1層都搬到C柱,若是繼續想下去你就會進入死循環,這時候你只須要作一個思惟轉換。3d

Image text

當咱們把n-1層都搬到了中間柱的時候,只須要把最大的那個盤,從A搬到C柱就行了,剩下的怎麼辦呢?C柱永遠是目標柱,咱們不須要去移動它。這時候咱們大點力!把B柱子掰下來!扔到A前面!無視掉C柱上面的大圓盤,由於咱們不會再去動它了!是否是畫面似曾相識?對啊!遞歸啊!繼續把最左邊的n-1層都弄到中間,最大的扔到C就行了啊!

看到這裏若是你還在鑽牛角尖的話,能夠暫時休息一下了。

思惟轉換完成的過來寫代碼!

// JS寫一下
function move(num,from,button,to){
    // 若是隻有一個圓盤
    if(num==1){
        console.log(from,"---->",to)
        // 最左邊的放到最後邊完了個事!
        return
    }
    // 若是柱子有點多咋辦呢?
    // 先把n-1個左邊的放到中間唄
    move(num-1,from,to,button) //放過去了,具體過程是啥?我特麼哪裏知道 它裏面怎麼操做?管他呢,反正他本身知道本身幹了啥
    console.log(from,"---->",to) // 我就幹一件事,我就把左邊最大的放到右邊,雖然我不知道如今我是否是真正的左邊,我多是被你大力從中間拽過來的左邊。
    // 放完了而後呢?
    // 把全部中間的柱子扔到最右邊去
    move(num-1,button,from,to)
}

move(3,"A","B","C") //測試一下
//golang
package main

import (
    "fmt"
)

func main() {
    move(3,"A","B","C")
}

func move(num int,from string,button string,to string){
    if num==1 {
        fmt.Printf("%s--->%s\n",from,to)
        return
    }
    move(num-1,from,to,button)
    fmt.Printf("%s--->%s\n",from,to)
    move(num-1,button,from,to)
}
# python

def move(num ,fro,button,to)
    if (num==1)
        print(fro,'--->',to)
        return
    move(num-1,fro,to,button)
    print(fro,'--->',to)
    move(num-1,button,fro,to)
move(3,'A','B','C')

總結

遞歸這個東西,千萬不可鑽牛角尖,把大問題分紅小問題,複雜問題簡單化,若是非要把遞歸過程推出來的話,那誰都救不了你

歡迎你們關注個人博客,裏面會有我所寫博客的視頻版本,若是你有更多疑問或者想學前端的話,能夠加我微信shouzi_1994或者在博客下方品論留言,三大Q.

相關文章
相關標籤/搜索