私は今あなたの質問を理解しています。あなたが望むものを達成する最も簡単な方法は、次のことだと思います:
def mycomb[T](n: Int, l: List[T]): List[List[T]] =
n match {
case 0 => List(List())
case _ => for(el <- l;
sl <- mycomb(n-1, l dropWhile { _ != el } ))
yield el :: sl
}
def comb[T](n: Int, l: List[T]): List[List[T]] = mycomb(n, l.removeDuplicates)
このメソッドは、入力リストから重複を削除してcomb
呼び出すだけです。mycomb
重複を削除すると、後で 2 つの要素が「同じ」かどうかを簡単にテストできます。私があなたのメソッドに加えた唯一の変更はmycomb
、メソッドが再帰的に呼び出されるときにel
、リストの前に表示される要素を削除することです。これは、出力に重複がないようにするためです。
> comb(3, List(1,2,3))
> List[List[Int]] = List(
List(1, 1, 1), List(1, 1, 2), List(1, 1, 3), List(1, 2, 2),
List(1, 2, 3), List(1, 3, 3), List(2, 2, 2), List(2, 2, 3),
List(2, 3, 3), List(3, 3, 3))
> comb(6, List(1,2,1,2,1,2,1,2,1,2))
> List[List[Int]] = List(
List(1, 1, 1, 1, 1, 1), List(1, 1, 1, 1, 1, 2), List(1, 1, 1, 1, 2, 2),
List(1, 1, 1, 2, 2, 2), List(1, 1, 2, 2, 2, 2), List(1, 2, 2, 2, 2, 2),
List(2, 2, 2, 2, 2, 2))