我找到了一种生成列表组合的方法,但是这里顺序无关紧要,但是我需要在顺序重要的地方生成变体。
组合:
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]]
答案 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
)中的每个元素执行此操作。
希望这会有所帮助。