Scala中如何停止回溯?
假设我正在使用回溯来解决问题(例如 N-Queen
)。如果我想找到唯一一个(第一个)解决方案而不是所有解决方案怎么办?
我想我可以强制(例如使用可变的布尔标志)。我想知道如何才能功能性地做到这一点。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
假设我正在使用回溯来解决问题(例如 N-Queen
)。如果我想找到唯一一个(第一个)解决方案而不是所有解决方案怎么办?
我想我可以强制(例如使用可变的布尔标志)。我想知道如何才能功能性地做到这一点。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
虽然 Scala 的
Option
可以在这里工作,正如其他两个答案所指出的那样,更惯用的功能方法是使用“惰性列表” - 或Stream
,在 Scala 中 — 表示解决方案集。我发现自己编写了这样的代码,例如:
现在假设我有一个扩展 Node[Board] 的
Board
类,并且它具有的实现Children
方法返回所有有效的棋盘以及一个附加棋子。假设它还有一些其他有用的东西,例如size
方法、带有empty
的伴生对象等。然后我可以编写以下代码来获取
Stream解决方案的
:Stream
是惰性的,仅评估其头部,因此现在我们仅在树中搜索足够远的距离来找到第一个解决方案。我们可以使用head
得到这个解决方案:或者其他。但如果我想要的话,我也可以获得其他结果:
这将搜索足够多的树来找到第十个解决方案,然后停止。
与
Option
方法相比,Stream
的一大优点是,如果我需要的话,我可以获得额外的结果,而无需为第一个结果支付更多费用。While Scala's
Option
will work here, as two other answers have pointed out, a more idiomatic functional approach would be to use a "lazy list"—or aStream
, in Scala—to represent the set of solutions.I've found myself writing code like this, for example:
Now suppose I have a
Board
class that extendsNode[Board]
and that has an implementation of thechildren
method that returns all valid boards with one additional piece. Suppose it also has some other useful stuff, like asize
method, a companion object with anempty
, etc.I can then write the following to get a
Stream
of solutions:A
Stream
is lazy and only evaluates its head, so right now we've only searched the tree far enough to find the first solution. We can get this solution usinghead
:Or whatever. But I can also get other results if I want them:
This searches just enough more of the tree to find the tenth solution, and then stops.
The big advantage of
Stream
over theOption
approach is that I can get additional results if I need them, without paying more for the first.这是一个简单的案例,深度优先搜索在找到要查找的内容时停止。正如 Chris K 的回答中提到的,它使用了
Option
。用法:
树
t
看起来像因此我们可以搜索一个元素并跟踪它访问的节点:
请注意,在找到我们要查找的内容后,我们不再访问任何节点。
Here's a simple case with a depth-first search that stops when it finds what it's looking for. It makes use of
Option
, as mentioned in Chris K's answer.Usage:
The tree
t
looks likeSo we can search for an element and trace the nodes it visits:
Notice that we don't visit any more nodes after we find what we're looking for.
假设您正在使用递归搜索函数,您的函数应该返回结果(即皇后的位置)或指示找不到该分支的结果。 Scala 可能有一个选项/也许类型,你可以使用它。这个建议同样适用于任何函数式语言。
Assuming you're using a recursive search function, your function should either return a result (i.e. positioning of the queens) or an indication that no result could be found for that branch. Scala probably has an option/maybe type, you can use that. This advice is equally applicable to any functional language.