加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在Scala中停止回溯?

发布时间:2020-12-16 08:49:57 所属栏目:安全 来源:网络整理
导读:假设我正在使用回溯来解决问题(例如N-Queen).如果我想找到唯一的(第一个)解决方案而不是全部解决方案,该怎么办? 我想我可以强制执行它(例如使用可变的布尔标志).我想知道我怎么能在功能上做到这一点. 解决方法 虽然 Scala的选项将在这里工作,正如另外两个答
假设我正在使用回溯来解决问题(例如N-Queen).如果我想找到唯一的(第一个)解决方案而不是全部解决方案,该怎么办?

我想我可以强制执行它(例如使用可变的布尔标志).我想知道我怎么能在功能上做到这一点.

解决方法

虽然 Scala的选项将在这里工作,正如另外两个答案所指出的,更惯用的功能方法是使用“惰性列表” – 或者在Scala中使用 Stream来表示解决方案集.

我发现自己编写了这样的代码,例如:

trait Node[A] {
  def children: Stream[A with Node[A]]

  def dfs(f: A => Boolean): Stream[A] = this.children.flatMap {
    child => if (f(child)) Stream(child) else child.dfs(f)
  }
}

现在假设我有一个扩展Node [Board]的Board类,它有一个子方法的实现,它返回所有有效的板,只有一个额外的块.假设它还有一些其他有用的东西,比如大小方法,带空的伴随对象等.

然后,我可以编写以下内容以获得解决方案流:

val solutions = Board.empty.dfs(_.size == 8)

Stream是懒惰的,只评估它的头部,所以现在我们只搜索了足够远的树来找到第一个解决方案.我们可以使用head获得此解决方案:

scala> solutions.head
res1: Board = 
o . . . . . . .
. . . . o . . .
. . . . . . . o
. . . . . o . .
. . o . . . . .
. . . . . . o .
. o . . . . . .
. . . o . . . .

管他呢.但如果我需要,我也可以得到其他结果:

scala> solutions(10)
res2: Board = 
. o . . . . . .
. . . . . . o .
. . . . o . . .
. . . . . . . o
o . . . . . . .
. . . o . . . .
. . . . . o . .
. . o . . . . .

这会搜索足够多的树以找到第十个解决方案,然后停止.

Stream优于Option方法的一大优势是,如果我需要它,我可以获得额外的结果,而不需要为第一个付出更多.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读