生成带有重复的变体 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
)。
希望对您有所帮助。
我找到了生成列表组合的方法,但这里的顺序无关紧要,但我需要在顺序重要的地方生成变体。
组合:
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
)。
希望对您有所帮助。