提问人:Bob Martin 提问时间:11/9/2023 最后编辑:Bob Martin 更新时间:11/10/2023 访问量:87
如何在不使用递归的情况下解决河内塔的这个问题?[复制]
How can I solve this issue of the Hanoi Tower without using recursive? [duplicate]
问:
我试图用非递归求解河内塔,但发生了错误。你能帮我一个忙吗?如果可能的话,我想知道javascript的解决方案。
这是我的代码,有错误:
const hanoi = (n) => {
const sign = ["a", "b", "c"];
const path = [];
let beforePile = 0;
while (n--) {
const nextPile = 1 + ((n + 1) % 2);
path.push([0, nextPile]);
const tmp = path;
for (let i = 0; i < tmp.length - 1; i++)
path.push([(path[i][0] + beforePile) % 3, (path[i][1] + beforePile) % 3]);
beforePile = nextPile;
}
path.forEach((i) => {
console.log(sign[i[0]] + " -> " + sign[i[1]]);
});
};
hanoi(3);
( 'a' : 开始, 'c': 目的地 )
答:
0赞
BlueSpider
11/9/2023
#1
当您查看此问题的路径时,它有一个规则。 为了将 n 个挂钩从“a”移动到“c”,将 n-1 个挂钩从“a”移动到“b”,然后将挂钩从 “a” 移动到“c”。然后将钉子的 n-1 从 'b' 移动到 'c'。因此,将“a”移动到“b”和将“b”移动到“c”之间的路径非常相似。但所有字母只相差 1 个距离。 我认为这是关键。
const hanoi = (n) => {
const sign = ["a", "b", "c"];
const path = [];
let beforePile = 0;
while (n--) {
const nextPile = 1 + ((n + 1) % 2);
path.push([0, nextPile]);
const tmp = path.length;
for (let i = 0; i < tmp - 1; i++)
path.push([(path[i][0] + beforePile) % 3, (path[i][1] + beforePile) % 3]);
beforePile = nextPile;
}
path.forEach((i) => {
console.log(sign[i[0]] + " -> " + sign[i[1]]);
});
};
hanoi(3);
评论