2016-07-24 72 views
0

當我查看簽名和函數調用時,我很難理解以下內容。傳遞Set [List [Int]]類型值而不是List [Int] - 爲什麼這會起作用?

在我的工作我有以下(從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" 

} 

考慮的placeQueenisSafe簽名:

def placeQueens(k: Int) : Set[List[Int]] 

def isSafe(col: Int, queens: List[Int]) : Boolean 

我不知道爲什麼它的工作原理。我們呼叫placeQueens並將結果保存在queens(在for循環中)。

結果應該是Set[List[Int]]。然後我們打電話isSafeIntSet[List[Int]]兩個參數 - 但我不明白爲什麼工作,因爲queens應該是Set[List[Int]]類型和參數爲isSafe應該List[Int]

回答

3

我們稱之爲placeQueens並將結果保存在皇后區

你的代碼是不節能的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 

執行此代碼後,bSet(3,4,5)。這是因爲在for循環的每次迭代中,x先是1,然後是2,然後是3.

2

我們調用placeQueens並將結果保存在queens(在for循環中)。

不,你打電話placeQueens並遍歷結果。在每次迭代中,queens引用當前元素。

相關問題