Вот одна реализация, которая ленивно перечисляет перестановки:
def insertions[X](xs: List[X], y: X): Iterable[List[X]] = {
val n = xs.size
for (i <- 0 to n) yield {
val (a, b) = xs.splitAt(i)
a ++ (y :: b)
}
}
def permutations[X](elems: List[X]): Stream[List[X]] = elems match {
case Nil => Stream(Nil)
case h :: t => permutations(t).flatMap(insertions(_, h))
}
Например,
permutations((0 to 10).toList) foreach println
будет печатать все элементы Stream
.