通过重复生成变化

时间:2018-10-21 19:29:14

标签: erlang

我找到了一种生成列表组合的方法,但是这里顺序无关紧要,但是我需要在顺序重要的地方生成变体。

组合:

comb_rep(0,_) ->
    [[]];
comb_rep(_,[]) ->
    [];
comb_rep(N,[H|T]=S) ->
    [[H|L] || L <- comb_rep(N-1,S)]++comb_rep(N,T).

此输出:

comb_rep(2,[1,2,3]).
[[1,1],[1,2],[1,3],[2,2],[2,3],[3,3]]

所需的输出:

comb_rep(2,[1,2,3]).
[[1,1],[1,2],[1,3],[2,2],[2,3],[3,1],[3,2],[3,3]]

1 个答案:

答案 0 :(得分:3)

按照评论中的解释,这将是我最初的方法:

cr(0, _) ->
    [];
cr(1, L) ->
    [ [H] || H <- L ];
cr(N, L) ->
    [ [H | T] || H <- L, T <- cr(N - 1, L -- [H]) ].

长度为0的排列是一种边缘情况。我什至会考虑删除该子句,以便如果这样调用该函数会失败。

长度为1的排列意味着仅每个元素在其自己的列表中

然后,对于递归情况,如果您已经拥有列表的排列而没有当前元素(cr(N - 1, L -- [H])),则只需将该元素添加到每个列表的开头即可,您只需要对原始列表(H <- L)中的每个元素执行此操作。

希望这会有所帮助。