すでに問題26で得ている解法というか、メソッドを使えば、この問題27を単純化できることに気がつく
object P27 { import P26.combinations def group3[T](l: List[T]): List[List[List[T]]] = for { a <- combinations(2, l) noA = l -- a b <- combinations(3, noA) } yield List(a, b, noA -- b) def group[T](ns: List[Int], l: List[T]): List[List[List[T]]] = ns match { case Nil => List(Nil) case n :: ns => combinations(n, l).flatMap(c => group(ns, l -- c).map(rest => c :: rest)) } }
scalaではfor文は配列の要素をループのカウントがわりに用いることができる。
for文のあとに記述することで、
for文のループ中の要素をyield文中のプログラムを実行することが可能です。
noA = l -- a
配列lから、配列aの要素を除いたモノを返す