【发布时间】:2014-10-26 00:18:13
【问题描述】:
我在理解 n Queens problem 的 Scala 解决方案时有些困难,下面是假设 isSafe 定义正确的实现
def queens(n: Int): Set[List[Int]] = {
def placeQueens(k: Int): Set[List[Int]] = k match {
case 0 => Set(List())
case _ =>
for {
queens <- placeQueens(k - 1)
col <- 0 until n
if isSafe(col, queens )
}yield k :: queens
}
placeQueens(n)
}
正如我所见,for 理解理论上应该返回一个缓冲集合,我在这里看到它缓冲了一个带有 k :: queens 的皇后列表,但它确实返回了一个 Set[List] 定义的。有人可以解释一下for 理解是如何工作的吗?
我的假设是否正确,for 每次都会返回一个集合的集合,因为在这种情况下,我处理嵌套 for 表达式中的一个 Seq 和一个 Set,它返回一个 Set[List]。
这个问题更多地与for 理解在实现 nQueen 而不是一般的 nQueen 相关。
【问题讨论】:
-
我认为下面的表达式可以清楚地显示背景中发生的情况表达式
for(x <- e1; y <- e2) yield e3被分解为过于独立的表达式for(y <- e2) yield e3与第一个表达式进行平面映射导致 @ 987654331@,因此在上述情况下,每个产生的queens列表必须平面映射到作为顶级集合的集合。
标签: scala for-comprehension n-queens