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