У меня есть некоторые трудности с пониманием решения n Queens на Scala, ниже приведена реализация, предполагающая isSafe определяется правильно
def queens(n: Int): Set[List[Int]] = {
def placeQueens(k: Int): Set[List[Int]] = k match {
case 0 => Set(List())
case _ =>
for {
queens <- placeQueens(k - 1)
col <- 0 until n
if isSafe(col, queens )
}yield k :: queens
}
placeQueens(n)
}
Для понимания, как я видел, теоретически должна возвращаться буферизованная коллекция, и я вижу здесь, что она буферизует список ферзей с k :: queens
, но на самом деле возвращает Set[List]
, как определено. Может ли кто-нибудь пролить свет на то, как работает это for
понимание?
Верно ли мое предположение, что for
каждый раз будет возвращать набор коллекций, и поскольку в этом случае я имею дело с Seq и Set во вложенном выражении for for, он возвращает Set[List]
.
Вопрос больше связан с пониманием for
реализации nQueen, а не nQueen в целом.
for(x <- e1; y <- e2) yield e3
разбито на слишком отдельное выражениеfor(y <- e2) yield e3
, плоское сопоставление с первым выражением, приводящим кe1.flatMap(x => for (y <- e2) yield e3)
, поэтому в приведенном выше случае каждый список полученногоqueens
должен быть плоско сопоставлены с набором, который является коллекцией верхнего уровня. - person Somasundaram Sekar   schedule 25.10.2014