返回列表的最大值

时间:2010-09-22 11:17:50

标签: list erlang sequential

我正在尝试返回列表的最大值。

我有以下代码

list_max([]) ->
    [];
list_max([H|T]) ->
    list_max(H, T).
list_max(Temp, []) ->
    Temp;
list_max(Temp, [H|T]) when H > Temp ->
    Temp = H;
list_max(Temp, T).

但我正在努力与Erlang联系。

如何为临时分配内容并将其替换为最高级别?

5 个答案:

答案 0 :(得分:4)

Erlang是其中一种语言,我发现它更容易展示而不是解释。

list_max([]   ) -> empty;
list_max([H|T]) -> {ok, list_max(H, T)}.

list_max(X, []   )            -> X;
list_max(X, [H|T]) when X < H -> list_max(H, T);
list_max(X, [_|T])            -> list_max(X, T).

并称之为:

{ok, Max} = list_max(MyList).

答案 1 :(得分:4)

抱歉,也许我错过了什么。你在寻找:

lists:max(List). %% Find the max in List

答案 2 :(得分:3)

  

如何为临时分配内容并将其替换为最高级别?

简短的回答是,你不能。 Erlang中的变量一旦分配就无法更改。

稍微长一点的答案是,虽然您无法在特定函数调用中更改变量,但您始终可以自我递归。 Erlang中的尾递归已经过优化。

在您提供的示例代码中,list_max只会查看列表的前两个元素。第四个和第五个条款应该再次调用list_max,并在第一个参数中使用Temp的新值。这在函数式语言中是常​​见的事情。在这种情况下,Temp被称为累加器(我经常将变量命名为Acc以反映此用途,但当然您可以根据需要命名它。)

让我展示一个可以被视为“介于两者之间”的另一个解决方案.Macelo的回答和stmi的回答:

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

list_max( X , []    ) -> X;
list_max( X , [H|T] ) -> list_max( erlang:max(H, X) , T ).

(我也放弃了检测空列表的子句,因为我认为它并没有真正为你买多少 - 虽然现在如果用空列表调用它会抛出异常。)

答案 3 :(得分:1)

您还可以表达内置函数:

-module(list_max).
-compile(export_all).

list_max([]) -> none;
list_max([H | T] = List) ->
    lists:foldl(fun erlang:max/2, H, T);
list_max(_) -> badarg.

答案 4 :(得分:1)

Erlang是一个单独的赋值,因此您无法更改“变量”。你只能创建新的。

我的建议是查看列表模块。在lists.erl里面你会发现:

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

max([H|T], Max) when H > Max -> max(T, H);
max([_|T], Max)              -> max(T, Max);
max([],    Max)              -> Max.

您不更新Max变量(示例中的Temp),而是使用新值调用该函数或从函数返回它。

容易腻......: - )

相关问题