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
谢谢!
我需要获取列表的组合和排列。
函数已经实现了排列。
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
谢谢!
一种选择是使用你的置换函数是这样的:
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)
重复)。
从您的解决方案,你可以这样做:
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]}
你好,李先生。有用! – seizetheday 2015-04-02 08:36:34