生成带有重复的变体 Erlang

Generate variations with repetitions 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]]

根据评论中的解释,这将是我的初步方法:

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)。

希望对您有所帮助。