遞歸之二(漢諾塔遊戲)

說到漢諾塔遊戲,是我最近才聽說的一個遊戲!(原諒我的無知...)

遊戲規則是這樣的:

有 x , y ,z  三根針,要求把 x 上的 3 個盒子放到 z 上

1. 小盒子只能放在大盒子上邊 

2. 一次只能搬運一個盒子

 那麼我們很容易可以得出步驟應該是這樣的

x ==> z

x ==> y

z ==> y

x ==> z

y ==> x

y ==> z

x ==> z

ok,我前邊說過遞歸一定含有微弱的耦合性,那麼想要寫遞歸一定要先找它們的共同點

廢話不多說,直接貼代碼吧!

function hanoi_ (n, x, y, z) {
  if (n === 1) {
    console.log(x + ' ==> ' + z)
  } else {
    hanoi_(n - 1, x, z, y)
    console.log(x + ' ==> ' + z)
    hanoi_(n - 1, y, x, z)
  }
}

hanoi_(3, 'X', 'Y', 'Z')

好,相信很多人目前都看不懂這個原理吧!更別說寫出來了。

那麼我們就先講一下這個函數的原理,再說說寫這個函數的人當初到底是什麼樣的思路呢?難道真的是天才?

愛迪生說過,天才就是 99% 的汗水加上 1% 的靈感。(下一句自己查百度)

那麼其實這 99% 的汗水一定是爲那 1% 的靈感而流的。

這個函數其實很簡單。單從函數角度講是這樣的

如果只有一個盒子那我只需要把當前盒子放到 z 上。

如果有 n 個盒子,那我就需要把 n-1 個盒子先放到 y 上,

然後才能把最後一個盒子也就是 n 放到 z 上,

最後把 n-1 個盒子 又從 y 移動到 z 上。

ok,本人暫時有事,先寫到這裏了,有時間再繼續寫。... 抱歉(聰明的人都喜歡自己分析)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章