5

既知の数のリストの組み合わせを生成することは、Scala では非常に簡単です。for-comprehension を使用できます。

for {
   elem1 <- list1
   elem2 <- list2 } yield List(elem1, elem2)

または、脱糖バージョンを使用できます。

list1.flatMap( elem1 => list2.map(elem2 => List(elem1,elem2)))

次のスイートでは、N 個のリストから要素の組み合わせを作成したいと思います (N は実行時に認識されます)。コンビネータの例に従うと、3 つのリストは次のようになります。

list1.flatMap( elem1 => list2.flatMap(elem2 => list3.map(elem3 => List(elem1,elem2,elem3)))

私はパターンを見て、そこに再帰があることを知っていますが、それを特定するのに苦労しています.

def combinations[T](lists:List[List[T]]): List[List[T]] = ???

何か案は?

4

3 に答える 3

8
def combinationList[T](ls:List[List[T]]):List[List[T]] = ls match {
     case Nil => Nil::Nil
     case head :: tail => val rec = combinationList[T](tail)
                          rec.flatMap(r => head.map(t => t::r))
}


scala> val l = List(List(1,2,3,4),List('a,'b,'c),List("x","y"))
l: List[List[Any]] = List(List(1, 2, 3, 4), List('a, 'b, 'c), List(x, y))

scala> combinationList(l)
res5: List[List[Any]] = List(List(1, 'a, x), List(2, 'a, x), List(3, 'a, x),
  List(4, 'a, x), List(1, 'b, x), List(2, 'b, x), List(3, 'b, x), List(4, 'b, x),
  List(1, 'c, x), List(2, 'c, x), List(3, 'c, x), List(4, 'c, x), List(1, 'a, y),
  List(2, 'a, y), List(3, 'a, y), List(4, 'a, y), List(1, 'b, y), List(2, 'b, y),
  List(3, 'b, y), List(4, 'b, y), List(1, 'c, y), List(2, 'c, y), List(3, 'c, y),
  List(4, 'c, y))
于 2013-11-04T13:57:49.963 に答える