2017-03-26 67 views
1

我是Erlang的新手。我一直在對隨機的數字列表進行快速排序(我也有它只保留唯一的數字,所以重複列表不會顯示在排序列表中)。它工作正常,輸出給沒有重複的排序數字,但我一直在試圖讓它不僅輸出列表,而且長度列表也是我遇到錯誤的地方。erlang - 是否可以在運行quicksort後輸出列表長度?

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 
+1

請張貼你寫的代碼以及當前和預期的輸出。 – Dogbert

+0

對不起。我忘了這麼做。我在上面編輯它。 – chitown88

回答

1

您可以通過使用io:format/2打印出清單的長度。只需要修改你的排序/ 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)]). 
+0

好的。但是這不會給出具體清單的長度。我不僅要分類,還要更具體地說,它只是列出了唯一的值。所以我想要唯一值列表的長度。 所以在我的例子中,我想要一個9的長度輸出。但不會在上面的長度爲15? – chitown88

+1

你的quicksort的結果將被分配到第一行的'Sorted',因此它將具有所需列表的值和它的長度。 – matov

+2

@ chitown88,*但是不會有以上的長度爲15?* - 不。所有的答案都是在sort/0函數的第一行添加一個變量,變量存儲你的sort/1函數的結果。然後,答案將第二行添加到sort/0函數中,該函數打印存儲在Sorted變量中的列表的長度......但爲什麼不能自己嘗試驗證長度是9而不是15? – 7stud

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> 
相關問題