2011-09-15 2 views
4

J'ai essayé à l'origine d'écrire ceci sans être récursif de queue, comme selon http://www.erlang.org/doc/efficiency_guide/myths.html le FAIS le fait lui-même. Cela fonctionne, je me demande juste si mon code est trop moche/inefficace. Celui aux programmes d'alphabétisation http://en.literateprograms.org/Selection_sort_%28Erlang%29 semble un peu moins concis que ma version, mais je pense que le mien a trop de paramètres pour être facilement compris. Je ne suis pas sûr si je me sentirais de cette façon si j'avais plus d'expérience avec la récursivité.Est-il possible d'écrire ceci sans accumulateur?

-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

Si vous sélectionnez max au lieu de min vous devriez pouvoir faire ce qui précède sans l'appel inverse. –

Répondre

1

Voici une version:

-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]). 

ou d'obtenir un maximum de YOUR ARGUMENT IS VALID a souligné avec accumulateur mais sans inverse:

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). 

Il semble les deux ont presque la même performance.

Questions connexes