經典演算法:漢諾塔
學程式設計,學IT,演算法也是必不可缺的,這一次給大家帶來一個經典的遞迴演算法題,漢諾塔。算是演算法的入門小題目之一吧~
視訊教程
什麼是漢諾塔?
我這裡直接拉來一個圖解釋一下(掛了請聯絡我)
就是這麼一個東西了,把所有的圓盤從左邊移動到右邊,並且大的圓盤不能夠壓住小的。怎麼才能完成呢?
規則理解了,開始鑽牛角尖
先來看看只有一個圓盤的情況,
嗯 相當的簡單A--->C 就可以了
兩個的情況呢?也不難A--->BA--->CB--->C
三個的話有點挑戰了 大家自己推一推
好的 十個呢?就算想了半天弄好了,怎麼讓程式幫我們做呢?頭大!
牛角尖鑽完了,冷靜分析
在我們每次完成之前的狀態,都是把最大的圓盤放到了最右邊,剩下的圓盤放到了中間。
然後把中間的再都放到右邊就好了
這道理就跟把大象裝冰箱一樣啊 都是三步呢!
這時候千萬不要去想怎麼把n-1層都搬到B柱 也不要想怎麼把N-1層都搬到C柱,如果繼續想下去你就會進入死迴圈,這時候你只需要做一個思維轉換。
當我們把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.