2016-07-24 18 views
0

Ich habe Schwierigkeiten, das Folgende zu verstehen, wenn ich auf die Signaturen und Funktionsaufrufe schaue.Übergeben eines Set [List [Int]] typisierten Wertes anstelle von List [Int] - warum funktioniert das?

In meinem Arbeitsblatt habe ich folgendes (aus einem Coursera Vortrag):

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" 

} 

Betrachtet man die Unterschriften von placeQueen und isSafe:

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

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

Ich frage mich, warum es funktioniert. Wir rufen placeQueens auf und speichern das Ergebnis in queens (in der for Schleife). Das Ergebnis sollte vom Typ Set[List[Int]] sein. Dann rufen wir isSafe mit zwei Parametern Int und Set[List[Int]] an - aber ich sehe nicht, warum das funktioniert, weil queens vom Typ Set[List[Int]] sein sollte und der Parameter für isSafe sollte List[Int].

Antwort

3

Wir nennen placeQueens und das Ergebnis in Queens speichern

Ihr Code ist nicht das Ergebnis von placeQueens in queens speichern.

for { 
    queens <- placeQueens(k - 1) 
    col <- 0 until n 
    if isSafe(col, queens) 
    } yield col :: queens 

Dieser Code wird tatsächlich zum Verständnis verwendet. Die besondere Linie in Frage:

queens <- placeQueens(k-1) 

ein List[Int] in Königinnen zu speichern, da es Iterieren über die Set[List[Int]] von placeQueens zurückgegeben. Um ein einfacheres Beispiel zu geben, die zeigen, könnte helfen, was los ist, betrachten:

val a = Set(1,2,3) 
val b = for (x <- a) yield x + 2 

Nach Ausführen dieses Code wird bSet(3,4,5) sein. Dies liegt daran, dass bei jeder Iteration in der for-Schleife x zuerst 1, dann 2, dann 3.

2

Wir rufen placeQueens auf und speichern das Ergebnis in queens (in der for-Schleife).

Nein, Sie rufen placeQueens und über das Ergebnis iterieren. Bei jeder Iteration bezieht sich queens auf das aktuelle Element.