2015-04-01 79 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 2015-04-02 08:36:34