Erlang - List-index排列而不重复相同的索引

时间:2017-11-04 18:28:07

标签: algorithm erlang

我有一个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>

1 个答案:

答案 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}]