6

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

我有以下代码

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 联系起来。

如何将某些内容分配给 temp 并将其替换为最高值?

4

5 回答 5

6

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).
于 2010-09-22T11:40:25.820 回答
4

如何将某些内容分配给 temp 并将其替换为最高值?

简短的回答是你不能。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 ).

(我还放弃了检测空列表的子句,因为我认为它并不能真正为您带来太多收益——尽管如果您使用空列表调用它,它现在会抛出异常。)

于 2010-09-22T15:48:55.650 回答
4

对不起,也许我错过了一些东西。您是否在寻找:

lists:max(List). %% Find the max in List
于 2010-09-26T11:45:52.793 回答
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.
于 2010-09-22T11:42:58.830 回答
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),而是使用新值调用函数或从函数中返回它。

十分简单... :-)

于 2010-09-23T14:10:08.600 回答