2015-04-01 3 views
0

ВсеКак реализовать комбинации списка

Мне нужно получить комбинации и перестановки в списке.

Функция была выполнена для перестановок.

perm:{[N;l]$[N=1;l;raze .z.s[N-1;l]{x,/:y except x}\:l]} 

Однако, я понятия не имею, о комбинациях, так же, как это:

l: 1 2 3 
comb[2;l] 
1 2 
1 3 
2 3 

l: 1 2 3 4 
comb[3;l] 
1 2 3 
1 2 4 
1 3 4 
2 3 4 

Спасибо!

ответ

0

Один из вариантов использовать функцию перестановки, как это:

q) comb:{[N;l] distinct asc each perm[N;l] } 

q)l: 1 2 3 4 
q) comb[3;l] 

выход:

1 2 3 

1 2 4 

1 3 4 

2 3 4 

Примечание: Это изменит порядок элементов из-за asc. Поэтому, если в вашем списке должно быть (1 3 2), ответ будет дано (1 2 3).

Для того, чтобы поддерживать порядок, использовать любую другую функцию/логику вместо asc для фильтрации повторяющихся элементов в наборах (например: (1 2 3) и (1 3 2) являются дубликатами).

0

От вашего решения, вы можете сделать:

q)comb:{[N;l]$[N=1;l;raze .z.s[N-1;l]{x,/:y where y>max x}\:l]} 
q)comb[2;1 2 3] 
1 2 
1 3 
2 3 

Другой подход с использованием over:

q)perm:{{raze x{x,/:y except x}\:y}[;y]/[x-1;y]} 
q)comb:{{raze x{x,/:y where y>max x}\:y}[;y]/[x-1;y]} 
+0

Привет, Ли. Оно работает! – seizetheday

Смежные вопросы