我有一个Erlang列表:[0, 4, 3, 0]
。我试图找到所有组合而不重复相同的排列 - 基于列表索引。
例如,我要找的最终结果是:[{0,4}, {0,3}, {0,0}, {4,3}, {4,0}, {3,0}]
。
...或者如果我将列表组合放在矩阵中,i
表示列表的索引,那么结果就是:
{i[0], i[1]}, {i[0], i[2]}, {i[0], i[3]}{i[1], i[0]}, {i[1], i[2]}, {i[1], i[3]}{i[2], i[0]}, {i[2], i[1]}, {i[2], i[3]}{i[3], i[0]}, {i[3], i[1]}, {i[3], i[2]}
我尝试使用列表推导,但到目前为止没有运气:
gorre@uplink:~/erlang$ erl
Erlang/OTP 20 [erts-9.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [kernel-poll:false]
Eshell V9.1 (abort with ^G)
1> L = [0, 4, 3, 0].
[0,4,3,0]
2> [{X, Y} || X <- L, Y <- L, X < Y].
[{0,4},{0,3},{3,4},{0,4},{0,3}]
3> [{X, Y} || X <- L, Y <- L, X > Y].
[{4,0},{4,3},{4,0},{3,0},{3,0}]
4> [{X, Y} || X <- L, Y <- L].
[{0,0}, {0,4}, {0,3}, {0,0},
{4,0}, {4,4}, {4,3}, {4,0},
{3,0}, {3,4}, {3,3}, {3,0},
{0,0}, {0,4}, {0,3}, {0,0}]
5>
答案 0 :(得分:4)
这可以通过递归来完成。这是以下代码的算法:我们从列表开始。在每次调用时,我们将列表的头部与尾部的每个元素组合在一起。然后,我们用列表的尾部递归。
combinations([]) -> [];
combinations([Head | Tail]) -> [{Head, X} || X <- Tail] ++ combinations(Tail).
1> a:combinations([0, 4, 3, 0]).
[{0,4},{0,3},{0,0},{4,3},{4,0},{3,0}]