Erlang 生成仅包含特定大小子集的集合的功率集

Erlang 生成仅包含特定大小子集的集合的功率集,erlang,set,subset,powerset,Erlang,Set,Subset,Powerset,我想生成一组S的powersetp(S)。我希望P(S)只包含等于某个大小的子集 例如,如果我们有S=[1,2,3,4],那么limited_powerset(S,3)将是[[1,2,3],[2,3,4],[1,3,4],[1,2,4]。 提供了在Erlang中生成通用电源集的一个很好的示例(谢谢!): 如何将其修改为只有特定大小的子集?引入限制变量并将最后一行更改为 case length([X|H]) < Limit of true ->

我想生成一组
S
的powerset
p(S)
。我希望
P(S)
只包含等于某个大小的子集

例如,如果我们有
S=[1,2,3,4]
,那么
limited_powerset(S,3)
将是
[[1,2,3],[2,3,4],[1,3,4],[1,2,4]。

提供了在Erlang中生成通用电源集的一个很好的示例(谢谢!):

如何将其修改为只有特定大小的子集?引入限制变量并将最后一行更改为

case length([X|H]) < Limit of
        true -> 
            ps(X, T, Acc, Limit);
        false -> 
            ps(X, T, [[X|H]|Acc],Limit)
    end.
外壳长度([X | H])<限制
正确->
ps(X,T,Acc,Limit);
错误->
ps(X,T,[[X | H]| Acc],极限)
结束。
没用


另外,我猜子集的数量将少于N!,但是我怎样才能准确地计算呢?

这将满足您的要求:

limited_powerset(L, N) ->
  {_, Acc} = generate(L, N),
  Acc.

generate([], _) ->
  {[[]], []};
generate([H|T], N) ->        
  {PT, Acc} = generate(T, N),
generate(H, PT, PT, Acc, N).

generate(_, [], PT, Acc, _) -> 
  {PT, Acc};
generate(X, [H|T], PT, Acc, N) when length(H)=/=N-1 ->
  generate(X, T, [[X|H]|PT], Acc, N);
generate(X, [H|T], PT, Acc, N) ->    
  generate(X, T, [[X|H]|PT], [[X|H]|Acc], N).

这不是小事。这件事让我难堪了一段时间。诀窍是,您需要在整个算法中保持完整的功率集累加器,并为有限的集创建第二个累加器。

如果它只包括给定集的某些子集,它就不是功率集。@Alexey我相信某个地方的数学家对功率集的此类子集有一个名称。dsmith,谢谢!这是可行的,但是我必须在问题中提到,我需要限制有两个原因:(a)不需要所有长度不是N的子集,(b)我认为我可以克服内存效率问题(动力集占用2^N的空间)在你写这篇文章这么多年之后,我希望你能够重新审视这些解决方案,并回答一个愚蠢的问题——“PT”这个名字代表什么?希望这能让我理解解决方案。因为在这一点上,我不明白generate/2应该完成什么,因为没有代码“组装”前面调用的结果。。。generate/5至少对ACC=)做了一些事情,但是,代码非常有效,所以我必须继续努力并解决它!=)alexakarpov,我使用OP中的变量名,但在我看来,它的意思是“T的动力集”,或“尾巴的动力集”。
limited_powerset(L, N) ->
  {_, Acc} = generate(L, N),
  Acc.

generate([], _) ->
  {[[]], []};
generate([H|T], N) ->        
  {PT, Acc} = generate(T, N),
generate(H, PT, PT, Acc, N).

generate(_, [], PT, Acc, _) -> 
  {PT, Acc};
generate(X, [H|T], PT, Acc, N) when length(H)=/=N-1 ->
  generate(X, T, [[X|H]|PT], Acc, N);
generate(X, [H|T], PT, Acc, N) ->    
  generate(X, T, [[X|H]|PT], [[X|H]|Acc], N).