說到漢諾塔遊戲,是我最近才聽說的一個遊戲!(原諒我的無知...)
遊戲規則是這樣的:
有 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,本人暫時有事,先寫到這裏了,有時間再繼續寫。... 抱歉(聰明的人都喜歡自己分析)