如何在不使用递归的情况下解决河内塔的这个问题?[复制]

How can I solve this issue of the Hanoi Tower without using recursive? [duplicate]

提问人:Bob Martin 提问时间:11/9/2023 最后编辑:Bob Martin 更新时间:11/10/2023 访问量:87

问:

我试图用非递归求解河内塔,但发生了错误。你能帮我一个忙吗?如果可能的话,我想知道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': 目的地 )

JavaScript C 算法 塔河内

评论

1赞 Robby Cornelissen 11/9/2023
geeksforgeeks.org/iterative-tower-of-hanoi
3赞 Pointy 11/9/2023
在一些编程语言(Erlang)中,递归是主要的迭代机制。“造成巨大损害的主要问题”是不准确的。Hanoi 问题本质上是递归的,因此您可以使用编程语言中内置的递归工具,也可以使用自己的堆栈实现自己完成,但这两种方法将执行几乎相同的操作。
0赞 Pointy 11/9/2023
作为对我评论的编辑,这个迭代技巧非常聪明。

答:

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);