问题标签 [towers-of-hanoi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
426 浏览

recursion - 无法理解我的讲师针对河内塔的递归算法

算法如下:

k 是磁盘的数量(http://en.wikipedia.org/wiki/Tower_of_Hanoi)。我了解递归,我只是不明白这是如何工作的,任何人都可以理解这一点吗?

抱歉在这里的描述含糊不清,只是我对正在发生的事情的理解也很模糊-我不知道 printf 行在做什么,这似乎对整个功能至关重要。

0 投票
2 回答
533 浏览

haskell - 这个 Haskell kata 解决方案可以变得更惯用吗?

经过 10 年的中断后,我正在重新学习 Haskell,部分是为了了解发生了什么变化,部分是作为在 C#、SQL 和 JavaScript 中度过的几天的解毒剂,部分是因为它突然变得很酷;-)

我决定将自己的 Towers of Hanoi 设置为编码 kata,足够简单的东西,但我已经觉得我的代码是非惯用的,并且很想听听任何 Haskell 老手可能有什么提示和技巧。

为了让 kata 更有趣,我将问题分为两部分,第一部分,函数moves,生成解决难题所需的移动序列。代码的其余部分旨在为塔建模并执行移动。

我绝对不满意的一个部分是moveDisc功能,如果扩展到 4 个塔,这将是乏味的。

河内.hs

TestHanoi.hs

我期待听到任何改进意见或建议。

0 投票
4 回答
17928 浏览

artificial-intelligence - 通过使用良好的状态空间和搜索树来解决河内塔

我想通过使用良好的“状态空间”来解决“河内塔”问题。使用适当的状态空间是一些 AI 技术建议的一种方式。拥有良好的状态空间后,我希望能够构建搜索树,然后使用诸如“DFS”(深度优先搜索)之类的策略来找到解决方案。

我的问题是,我只是不知道如何开发一个好的状态空间,然后用它来构建一个搜索树。谁能描述如何为河内塔问题创建状态空间?然后告诉我如何为此构建搜索树?

0 投票
5 回答
24229 浏览

c++ - 河内塔

我正在做一本书的练习,要求我们使用递归方法解决河内塔问题。我已经找到了一个解决方案,但是从我浏览互联网后收集的信息来看,我的解决方案可能不正确。有谁知道解决问题的更好/不同的方法?有没有人有改进的建议。(顺便说一句,输出是正确的。它只应该告诉从哪个塔到另一个钉子正在移动,而不是具体是哪个钉子​​)

这是代码:

这种方法是否符合递归条件?

0 投票
2 回答
3671 浏览

recursion - 延续传递风格使事情尾递归?

在这里问它很痛苦。确实如此。每次我徒劳地寻找问题的答案时,我都会看到它。嘲讽我。堆栈溢出

无论如何,一些地狱般的影响使我试图解决河内塔。我的第一个解决方案不完整,因为如果使用太多磁盘运行会导致内存错误:

我在某处读到延续传递风格可以解决问题。但是,这也无济于事

0 投票
2 回答
10137 浏览

javascript - 递归算法如何适用于河内塔?

这是我解释递归的书中的代码。问题是我不明白程序采取的步骤:

这是输出的读取方式:

有人可以逐步分解吗?这对我很有帮助。

0 投票
1 回答
565 浏览

functional-programming - 在河内塔中移动圆盘的惯用功能方式

我正在学习 Scheme,作为一个玩具示例,我正在为 Hanoi Towers 做一个解决方案验证器(不是求解器)。我想使用纯粹的功能风格(只是为了进入心态),我将塔表示为三个列表的简单列表。起始状态可能如下所示:'((0 1 2 3 4) () ())

我将如何实现一个接受状态、源索引和目标索引并返回新状态的函数?在命令式风格中,这将是微不足道的,例如:

但是我能想到的每一个功能性解决方案都非常复杂。例如:

这似乎可行,但必须有更好的方法。我想地图会比递归好一些,但还是太多了。如果我以不同的方式表示状态会更容易吗?

另外,请随时批评我的代码。我真的不知道我在做什么。

编辑:如果可能的话,我希望你不要假设塔的数量总是 3。

0 投票
4 回答
1313 浏览

common-lisp - 带有命名光盘的河内塔

对于一项任务,我必须使用命名光盘在 Common LISP 中创建河内塔。我需要得到如下所示的输出:

然而,当我运行我创建的程序时,我得到如下输出:

这是我的代码:

代码的问题显然是 move-disk 函数,因为它只是在调用后丢弃结果。但我不确定我如何准确地确定我应该从哪些全局变量中推送和弹出。我一直在摆弄使用一个大列表来表示塔并将钉子作为子列表,但是我在确定要修改列表的哪一部分时遇到了同样的问题。任何帮助,将不胜感激。我觉得我完全处于死胡同。

0 投票
1 回答
1115 浏览

recursion - Common lisp 中的河内塔

我认为这将是一个模糊的问题,因为我一开始并不确切知道我在做什么,但它就是这样。

我必须使用列表在普通 lisp 中解决河内塔问题。基本上,一个函数获取一个字符串(名称)列表,然后使用 peg B 将它们从 peg A 移动到 peg C 进行存储,使它们保持与列表中相同的顺序。

我以前从未使用过 lisp,而且我发现语法很难理解。这是我到目前为止的代码 goo 功能是河内的工作

我的问题是递归调用。我对我到底应该做什么感到非常困惑。我知道我显然必须将第一个列表中的第一个字符串移动到另一个挂钩,但我不知道哪个挂钩甚至如何操作列表。我觉得我应该使用传递给 goo 函数的变量,但我不知道如何编辑它们,因为当我在函数中更改它们时,外部变量不会改变。

现在我遇到了错误

* - SYSTEM::%EXPAND-FORM: (GOO (1- LENG) FROM VIA TO) 应该是一个 lambda 表达式

这是一个递归调用,所以我不知道它为什么这么说。

基本上我只是想要一些关于在哪里继续或从哪里重新开始的提示或技巧,因为我什至不知道我的方法是否是一个好的方法。任何事情都非常感谢。谢谢

0 投票
1 回答
2073 浏览

recursion - 在 Lisp 中解决递归的河内塔

我在 lisp 中的代码如下:

我是 lisp 的新手,不知道我做错了什么。对此的帮助将不胜感激,因为我已经在这几个小时了。

谢谢。