List 返回列表的最大值

List 返回列表的最大值,list,erlang,sequential,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). 但我很难与二郎相处 如何将某个内容分配给temp并将其替换为最高级别?Erlang是我发现显

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

我有以下代码

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).
但我很难与二郎相处


如何将某个内容分配给temp并将其替换为最高级别?

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

您还可以表示除内置函数外的其他函数:

-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.
如何将某些内容分配给temp并将其替换为最高值

简而言之,你不能。一旦赋值,Erlang中的变量就无法更改

稍微长一点的答案是,虽然不能在特定函数调用中更改变量,但始终可以自递归。对Erlang中的尾部递归进行了优化

在您提供的示例代码中,list_max将只查看列表的前两个元素。第四和第五个子句应再次调用每个调用列表_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 ).

(我还抛弃了检测空列表的子句,因为我认为它并没有给您带来太多好处——尽管如果您使用空列表调用它,它现在会抛出一个异常。)

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),而是使用新值调用函数或从函数返回它


简单的豌豆…:-)

对不起,也许我遗漏了什么。您正在寻找:

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

由于
max
是关联的,所以您应该使用尾部递归
foldl
。这对我来说是一个非常好的理解,但谢谢。刚刚开始在Uni中使用erlang这个术语。
when is_list(list)
在这里几乎没有用处,因为它只检查是否存在
[]
或[|]。它没有检查“正确列表”。@Hynek-Well。。。它不是几乎无用的。。。它是完全无用的,因为列表上的匹配(使用尖括号)已经告诉您它是一个列表。事实上,“when”子句是完全无用的,所以根据大众的要求,我也纠正了这一点。不,我需要自己做好极了D谢谢你。现在我能够理解文档了hahaha@daniel-luna的例子是最好的。它实际上是lists:max(L)函数的Erlang本机实现。为什么更好?请注意迭代顺序。在您的情况下,您将首先为列表末尾的每个迭代进行不必要的匹配。最佳迭代案例是daniel luna示例这是正确的示例。它实际上是lists:max(L)函数的Erlang本机实现。为什么更好?请注意,与此处发布的所有其他解决方案相比,迭代顺序提供了最佳性能。
lists:max(List). %% Find the max in List