sorting - 没有累加器可以写这个吗?

标签 sorting recursion erlang tail-recursion

根据 http://www.erlang.org/doc/efficiency_guide/myths.html,我最初尝试在没有尾递归的情况下编写此代码BEAM 自己做。它有效,我只是想知道我的代码是否过于丑陋/效率低下。扫盲项目的一位http://en.literateprograms.org/Selection_sort_%28Erlang%29似乎没有我的版本那么简洁,但我觉得我的参数太多,不容易理解。如果我对递归更有经验,我不确定我是否会有这种感觉。

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

最佳答案

这是一个版本:

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

似乎两者的性能几乎相同。

关于sorting - 没有累加器可以写这个吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7438223/

相关文章:

php - 通过 PHP 中的目录树递归

java - 返回链表中节点的位置,递归方法

erlang - 为什么net_kernel :monitor_nodes/2 not deliver nodeup/nodedown messages for sname nodes?

sorting - CUDA:如何直接在 GPU 上使用推力::sort_by_key?

c++ - 对 vector 中的一个元素进行排序的最有效方法?

sorting - 具有搜索、分页和排序功能的 Spring Boot Data JPA 表

c++ - 从 C++ 中的符号、指数和尾数部分创建 NaN 浮点值

c - 这个嵌套函数问题可以在 C 中解决吗?

erlang - 带计数器的 Foreach 循环

erlang - 是否可以重新创建 erlang 的 :math functions as elixir macros?