Javascript数据结构与算法--栈的实现与用法 (2)

问题:
请问至少需要移动多少次圆盘?每次移动的步骤是怎样的?

let num = 0 // 记录移动的次数 /** * 记录圆盘移动的过程 * * 这里的思路,一直在循环做一件事情。 * 把原始柱子上的圆盘分为两部分,最大和其它。 * 第一回合,将其它移动到辅助柱子上,将最大的移动到目标柱子上,再将其它移动到目标柱子上 * 第二回合,将其它移动到辅助柱子上,将最大的移动到目标柱子上,再将其它移动到目标柱子上 * ... * 第2 ** n - 1回合,将其它移动到辅助柱子上,将最大的移动到目标柱子上,再将其它移动到目标柱子上 * * 但是,这里源柱子、辅助柱子和目标柱子会随着其它盘而变动。 * 其它盘在哪个柱子上,哪根柱子就是源柱子。 * @param {Int32Array} plates 圆盘个数 * @param {Array} source 源柱子 * @param {Array} helper 辅助柱子 * @param {Array} dest 目的地柱子 * @param {String} sourceName 源柱子的名字 * @param {String} helperName 辅助柱子的名字 * @param {String} destName 目的地柱子的名字 * @param {Array} moves 步骤存储器,存储每一步的流程 */ function moveOfHanoi( plates, source, helper, dest, sourceName, helperName, destName, moves = [] ) { if (plates <= 0) { return moves } else if (plates === 1) { // 弹出源柱子上剩下的最大圆盘,并将其压入目标柱子 dest.push(source.pop()) num++ let sourceArr = source.toString() let helperArr = helper.toString() let destArr = dest.toString() let movestr = `第 ${num} 步,将圆盘 ${plates} 从 ${sourceName} 移至 ${destName}; ${sourceName}: [${sourceArr}],${helperName}: [${helperArr}],${destName}: [${destArr}]` moves.push(movestr) } else { moveOfHanoi( plates - 1, source, dest, helper, sourceName, destName, helperName, moves ) // 弹出源柱子上剩下的最大圆盘,并将其压入目标柱子 dest.push(source.pop()) num++ let sourceArr = source.toString() let helperArr = helper.toString() let destArr = dest.toString() let movestr = `第 ${num} 步,将圆盘 ${plates} 从 ${sourceName} 移至 ${destName}; ${sourceName}: [${sourceArr}],${helperName}: [${helperArr}],${destName}: [${destArr}]` moves.push(movestr) moveOfHanoi( plates - 1, helper, source, dest, helperName, sourceName, destName, moves ) } return moves } /** * 汉诺塔 * 记录每一次圆盘移动的动作。从${源柱子}到${目标柱子} * @param {Int32Array} plates 圆盘的个数 * @param {String} sourceName 源柱子的名称 * @param {String} helperName 辅助柱子的名称 * @param {String} destName 目标柱子的名称 */ function hanoiStackArray(plates, sourceName, helperName, destName) { let source = new Stack() let helper = new Stack() let dest = new Stack() for (let i = plates; i > 0; i--) { source.push(i) } num = 0 return moveOfHanoi( plates, source, helper, dest, sourceName, helperName, destName ) }

[完]

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfjfj.html