我正在尝试返回列表的最大值。
我有以下代码
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).
如何将某些内容分配给 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 ).
(我还放弃了检测空列表的子句,因为我认为它并不能真正为您带来太多收益——尽管如果您使用空列表调用它,它现在会抛出异常。)
对不起,也许我错过了一些东西。您是否在寻找:
lists:max(List). %% Find the max in List
您还可以在内置函数中表示:
-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.
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),而是使用新值调用函数或从函数中返回它。
十分简单... :-)