Как уже говорилось, это проблема перестановки.В Scala 2.8 вы могли бы написать что-то вроде этого:
def permut[T](l: List[T]): List[List[T]] = {
def retire(e: T, l: List[T]): List[T] = l match {
case Nil => Nil
case x::xs if e == x => xs
case x::xs => x::retire(e, xs)
}
l match {
case Nil => List(Nil)
case _ => for ( x <- l; p <- permut(retire(x, l))) yield (x :: p)
}
}
Затем:
scala> permut("abc" toList) map {_.mkString }
res11: List[String] = List(abc, acb, bac, bca, cab, cba)
(хотя я не уверен, что моя перестановка является оптимальной. По крайней мере, выход на пенсию может бытьхвост рекурсивный)