js用遞歸實現一個漢諾塔的完成步驟,相信很多同學都會。
我自己業餘的時候寫了個漢諾塔的遊戲,裡面有一個提醒功能, 用戶點提醒,程式利用遞歸實現一個完成步驟,然後操作頁面元素根據這個步驟來實現。
局部程式碼如下:
var moves = []; // 存放完成步骤
/**
* @param disc 当前关卡 (实际上也就是圆盘数量)
* @param discs1 第一根圆柱
* @param discs2 第二根圆柱
* @param discs3 第三根圆柱
*/
function hanoiArithmetic(disc, discs1, discs2, discs3) {
if (disc > 0) {
hanoiArithmetic(disc - 1, discs1, discs3, discs2);
moves.push(discs1 + '>' + discs3);
hanoiArithmetic(disc - 1, discs2, discs1, discs3);
}
}
hanoiArithmetic(4, 'discs1', 'discs2', 'discs3');
console.log(moves);
// 最后得到这样一个步骤列表
[ 'discs1>discs3',
'discs1>discs2',
'discs3>discs2',
'discs1>discs3',
'discs2>discs1',
'discs2>discs3',
'discs1>discs3' ] // 大概意思就是想从第一个圆柱取最上面那个圆盘放到第三个圆柱...
一切都沒什麼問題, 現在碰到的難題是, 這只能完全是一個新關卡,用戶沒有移動過任何圓盤的情況下,生成的一個步驟列表, 如果用戶移動過圓盤, 比如現在第一根圓柱上面3個圓盤, 第二個上面2個圓盤,第三個上面1個圓盤, 用戶被難住了,不知道下一步該怎麼走了,這時候點提醒, 怎麼根據當前的情況來產生後續的步驟演算法呢?
說來比較慚愧, 這個遊戲半年前寫的, 到目前為止這個提醒功能還沒完成, 我一點頭緒都沒有。
這個你可以看斐波拉契數列 漢諾塔就是斐波拉契演算法
如果需要這樣的提醒功能,比你現在的複雜一些,需要紀錄狀態。
例如你這個例子是6個圓盤,第一根柱子上3個圓盤,有可能是456,也有可能是135,你需要明確現在的狀態,然後完成步驟再從上向下分解。