如何在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方法的一大优势是,如果我需要它,我可以获得额外的结果,而不需要为第一个付出更多. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |