使用List comprehension在Erlang中对列表进行排序

时间:2014-03-31 14:50:55

标签: list erlang list-comprehension

sortLC(列表) - > [如果L< M - >升;是的 - > M结束|| L< -List,M< -List] 我试图排序列表 使用此方法:列表理解

3 个答案:

答案 0 :(得分:1)

列表理解不适用于此用法。生成器分别生成其列表中的所有元素,如果有多个生成器,则从左到右获得所有可能的组合

1> [{X,Y,Z} || X <- [1,2], Y <- [a,b], Z <- [y,z]].         
[{1,a,y},
 {1,a,z},
 {1,b,y},
 {1,b,z},
 {2,a,y},
 {2,a,z},
 {2,b,y},
 {2,b,z}]

当生成器按此顺序进行评估时,可以重复使用位于右侧的另一个生成器生成的值:

2> F2 = fun(N) -> [{X,Y,Z} || X <- lists:seq(1,N-2), Y <- lists:seq(X+1,N-1), Z <- lists:seq(Y+1,N)] end.
#Fun<erl_eval.6.80484245>
3> F2(5).                                                                      
[{1,2,3},                 
 {1,2,4},
 {1,2,5},
 {1,3,4},
 {1,3,5},
 {1,4,5},
 {2,3,4},
 {2,3,5},
 {2,4,5},
 {3,4,5}]

有意限制案件数量。您还可以添加过滤器,以便只生成符合条件的n-uplet:

4> F1 = fun(N) -> [{X,Y,Z} || X <- lists:seq(1,N-2), Y <- lists:seq(X+1,N-1), Z <- lists:seq(Y+1,N), X*X + Y*Y - Z*Z == 0] end.
#Fun<erl_eval.6.80484245>
5> F1(5).
[{3,4,5}]

在这里,您可以获得3个数字的所有组合,例如X&lt; Y&lt; Z和X²+Y²-Z²== 0:o)

当然可以使用X,Y,Z元素作为函数的参数,在这种情况下,参数将在每个组合上执行,您将收集结果列表:

6> F = fun(N) -> [io:format("~w, ~w and ~w is a Pythagorean Triple~n",[X,Y,Z]) || X <- lists:seq(1,N-2), Y <- lists:seq(X+1,N-1), Z <- lists:seq(Y+1,N), X*X + Y*Y - Z*Z == 0] end.
#Fun<erl_eval.6.80484245>
7> F(20).
3, 4 and 5 is a Pythagorean Triple
5, 12 and 13 is a Pythagorean Triple
6, 8 and 10 is a Pythagorean Triple
8, 15 and 17 is a Pythagorean Triple
9, 12 and 15 is a Pythagorean Triple
12, 16 and 20 is a Pythagorean Triple
[ok,ok,ok,ok,ok,ok]

您可以看到用法是对每个组合进行一些评估,最终进行过滤,但没有内置的概念来累积或构建单个结果。

答案 1 :(得分:0)

这不会真的奏效。看起来你不能正确理解Erlang语义。特别是列表理解的作用。您的解决方案返回列表的笛卡尔积。尝试查看[{X,Y} ||的输出X&lt; -L,Y&lt; -L]。这可能暗示你正在发生的事情。有几种方法可以通过LC对列表进行排序。一个是以下内容:

sort([]) -> [];
sort([E | Rest]) ->
    Less = [X || X <- Rest, X =< E],
    Greater = [X || X <- Rest, X > E],
    sort(Less) ++ [E] ++ sort(Greater).

(未经测试)。我们的想法是将列表分成两半。那些元素少于第一个元素的元素。那些元素更大的那些。然后,这个分区设置了Quicksort中的递归分治方案。要测试正确性,可以使用PropEr / QuickCheck提升内置排序功能:

prop_sort() ->
  ?FORALL(L, list(int()),
     begin
         equal(lists:sort(L), sort(L))
     end).

答案 2 :(得分:0)

如果您对热门排序算法(冒泡,插入,快速,合并)及其在erlang中的实现感兴趣,可以查看here