当我查看签名和函数调用时,我很难理解以下内容。
在我的工作表中,有以下内容(摘自Coursera的演讲):
object nqueens {
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 queensWithRow = (row - 1 to 0 by -1) zip queens
queensWithRow forall {
case (r, c) => col != c && math.abs(col - c) != row -r
}
}
def show(queens: List[Int]) = {
val lines =
for (col <- queens.reverse)
yield Vector.fill(queens.length)("* ").updated(col, "X ").mkString
"\n" + (lines mkString "\n")
}
(queens(4) map show) mkString "\n"
}
考虑到签名placeQueen
和isSafe
:
def placeQueens(k: Int) : Set[List[Int]]
def isSafe(col: Int, queens: List[Int]) : Boolean
我不知道为什么行得通。我们调用placeQueens
并将结果保存在queens
(在for
循环中)。
结果应为类型Set[List[Int]]
。然后,我们称之为isSafe
有两个参数Int
和Set[List[Int]]
-但我不明白为什么这作品,因为queens
应该是类型Set[List[Int]]
为和参数isSafe
应List[Int]
。
我们调用placeQueens并将结果保存为Queens
您的代码未将的结果保存placeQueens
到中queens
。
for {
queens <- placeQueens(k - 1)
col <- 0 until n
if isSafe(col, queens)
} yield col :: queens
该代码实际上用于理解。有问题的特定行:
queens <- placeQueens(k-1)
正在将List[Int]
存入皇后区,因为它正在对从Set[List[Int]]
返回的返回进行迭代placeQueens
。为了给出一个更简单的示例,它可能有助于说明正在发生的事情,请考虑:
val a = Set(1,2,3)
val b = for (x <- a) yield x + 2
执行此代码后,b
将为Set(3,4,5)
。这是因为在for循环的每次迭代中,x
先是1,然后是2,然后是3。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句