【发布时间】:2021-03-11 10:37:51
【问题描述】:
我对 Coursera 的以下 Scala 代码感到困惑。这段代码的目的是在一个箱子板上放置 n 个皇后,这样没有皇后相互威胁,即同一行、同一列或对角线。
-
递归调用
PlaceQueen(k-1)的评估如何在从 k =0 到 k = n 的每个步骤中进行?yield col::queens行中是否发生了递归调用PlaceQueen(k-1)? -
如果
col::queens将前面行的列追加为列表,则yield col::queens的输出应该是列列表。但是它是如何转化为 Set of list 的呢?object nQueens extends App{ def queens(n: Int): Set[List[Int]] = { def placeQueens(k: Int): Set[List[Int]] = if (k == 0) Set(List()) else for { queens <- placeQueens(k - 1) col <- 0 until n if isSafe(col, queens) } yield col :: queens placeQueens(n) } def isSafe(col: Int, queens: List[Int]): Boolean = { val row = queens.length val queensWithRows = (row - 1 to 0 by -1) zip queens queensWithRows forall { case (c, r) => col != c && math.abs(col - c) != row - r } } queens(4) }
输出是:
Set(List(1,3,0,2), List(2,0,3,1))
【问题讨论】:
-
如果您可以发布可编译的代码,这会有所帮助。我已经修复了一些明显的错误,但仍然不正确或不完整。