2011-09-15 202 views
4

我最初試着寫這個而不是尾遞歸,因爲根據http://www.erlang.org/doc/efficiency_guide/myths.html BEAM自己做。它的工作原理,我只是想知道我的代碼是否過於醜陋/效率低下。有識字的程序http://en.literateprograms.org/Selection_sort_%28Erlang%29似乎比我的版本簡潔一點,但我覺得我的太多params很容易理解。如果我對遞歸更有經驗,我不確定自己是否會有這種感覺。是否可以在沒有累加器的情況下寫入?

-module(selection). 
-export([selection/1]). 

selection([H|T]) -> lists:reverse(selection(T,H,[],[])). 

selection([],Min,[H|T],Acc) -> selection(T,H,[],[Min|Acc]); 
selection([],Min,[],Acc) -> [Min|Acc]; 
selection([H|T],Min,Rest,Acc) when H < Min -> selection(T,H,[Min|Rest],Acc); 
selection([H|T],Min,Rest,Acc) -> selection(T,Min,[H|Rest],Acc). 
+1

如果您選擇max而不是min,那麼您應該可以在不進行反向調用的情況下執行上述操作。 –

回答

1

這裏是一個版本:

-module(selection). 

-export([selection/1]). 

selection([]) -> []; 
selection([H|T]) -> 
    {Min, Rest} = remove_min(H, T, []), 
    [Min | selection(Rest)]. 

remove_min(Min, [], Rest) -> {Min, Rest}; 
remove_min(SoFar, [H|T], Acc) when H < SoFar -> 
    remove_min(H, T, [SoFar|Acc]); 
remove_min(Min, [H|T], Acc) -> remove_min(Min, T, [H|Acc]). 

或得到最大爲YOUR ARGUMENT IS VALID指出了蓄電池,但沒有反向:

selection([H|T]) -> selection(T,H,[],[]). 

selection([],Max,[H|T],Acc) -> selection(T,H,[],[Max|Acc]); 
selection([],Max,[],Acc) -> [Max|Acc]; 
selection([H|T],Max,Rest,Acc) when H > Max -> selection(T,H,[Max|Rest],Acc); 
selection([H|T],Max,Rest,Acc) -> selection(T,Max,[H|Rest],Acc). 

好像都有幾乎相同的性能。

相關問題