我正在尝试返回列表中的最大值。
我有以下代码:
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并替换为最高值?
我正在尝试返回列表中的最大值。
我有以下代码:
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并替换为最高值?
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).
lists:max(List). %% Find the max in List
list_max( [H|T] ) -> list_max( H , T ).
list_max( X , [] ) -> X;
list_max( X , [H|T] ) -> list_max( erlang:max(H, 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.
max
是可结合的,因此您应该使用尾递归的 foldl
。 - Marcelo Cantosis_list(List)
几乎没有用处,因为它只检查是否存在 []
或者 [|]。它并不检查“proper list”。 - Hynek -Pichi- VychodilErlang 是一种单赋值语言,因此您无法更改“变量”。您只能创建新的变量。
我的建议是查看列表模块。在 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),而是使用新值调用函数或从函数中返回它。
非常简单...:-)