Слишком много случаев, ненужные сложные combinations2
и subList
.
Вспомните, как определены комбинации .Если у вас есть набор {a1, ..., aN}
, и вы хотите выбрать k
элементы из этого набора, то вы можете по существу просто две вещи:
- Вы не делаетевключите
a1
в подмножество.Затем вы должны выбрать k
элементов из оставшихся {a2, ..., aN}
. - Вы включаете
a1
в подмножество.Затем вы должны выбрать k-1
элементы из {a2, ..., aN}
и добавить a0
к этим k-1
элементам.
Вот откуда взята формула
C(N, k) = C(N - 1, k) + C(N - 1, k - 1)
.
В коде это просто:
def comb[A](ls: List[A], k: Int): List[List[A]] = {
if (k == 0) List(Nil)
else ls match {
case Nil => List()
case h :: t => comb(t, k) ++ comb(t, k - 1).map(h :: _)
}
}
Пример:
comb(List('a, 'b, 'c, 'd, 'e), 3) foreach println
дает:
List('c, 'd, 'e)
List('b, 'd, 'e)
List('b, 'c, 'e)
List('b, 'c, 'd)
List('a, 'd, 'e)
List('a, 'c, 'e)
List('a, 'c, 'd)
List('a, 'b, 'e)
List('a, 'b, 'd)
List('a, 'b, 'c)