2016-07-24 2 views
0

Мне трудно понять следующее, когда я смотрю на подписи и вызовы функций.Передача набора [List [Int]] введенного значения вместо списка [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" 

} 

Учитывая, подписи 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].

ответ

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 

После выполнения этого кода, b будет Set(3,4,5). Это связано с тем, что на каждой итерации в цикле обработки x сначала 1, затем 2, затем 3.

2

Мы вызываем placeQueens и сохраняем результат в queens (в цикле for).

Нет, вы звоните placeQueens и итерации по результату. На каждой итерации queens ссылается на текущий элемент.

Смежные вопросы