我是Erlang的新手。我一直在对随机的数字列表进行快速排序(我还有它只保留唯一的数字,因此重复项不会出现在排序列表中)。它工作得很好,因为输出给出了没有重复的排序数字,但我一直试图让它不仅输出列表,而且还输出长度列表,这也是我遇到错误的地方。
length(mod:func).
将在erlang shell中给出列表的长度没有问题,但是在快速排序的递归之后我无法让它工作。我尝试过分配变量并执行lists:append
。我只是不知道我做错了什么。
任何人都可以解释一下吗?
抱歉,我忘了附上以下代码。这是基本的快速排序。
-module(list).
-export([sort/0]).
-export([sort/1]).
sort() -> sort([3,3,3,4,1,2,3,2,6,5,9,11,3,10,5]).
sort([]) -> [];
sort([Pivot|Tail]) ->
sort([ X || X <- Tail, X < Pivot]) ++
[Pivot] ++
sort([ X || X <- Tail, X > Pivot]).
当我在shell中运行它时,列表很好。如果我运行长度函数,它会给出9这就是我想要的。
55> c(list).
{ok,list}
56> list:sort().
[1,2,3,4,5,6,9,10,11]
57> length(list:sort()).
9
但是我试图让它只做list:sort()
,然后立即给出列表和列表的长度。我尝试了很多不同的东西,我试图查找它,但似乎无法找到如何将两者合并在一起工作。看起来长度BIF是非常直接的功能,我只是没有以正确的方式使用/推进它。那有意义吗?
我希望这样说:
55> c(list).
{ok,list}
56> list:sort().
[1,2,3,4,5,6,9,10,11]
The length of the list is 9
答案 0 :(得分:1)
您可以使用io:format/2打印列表长度。只需要修改sort / 0函数就可以为它添加一行:
sort() ->
Sorted = sort([3,3,3,4,1,2,3,2,6,5,9,11,3,10,5]),
io:format("~p~nThe length of the list is ~w~n", [Sorted, length(Sorted)]).
答案 1 :(得分:1)
1> S = fun S([]) -> {[],0};
1> S([P|T]) ->
1> {Small,LSmall} = S([X || X <- T, X < P]),
1> {Big,LBig}= S([X || X <- T, X > P]),
1> {Small ++ [P] ++ Big, LSmall+LBig+1}
1> end.
#Fun<erl_eval.30.52032458>
2> S([3,3,3,4,1,2,3,2,6,5,9,11,3,10,5]).
{[1,2,3,4,5,6,9,10,11],9}
3>