我正在尝试返回列表的最大值。
我有以下代码
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联系。
如何为临时分配内容并将其替换为最高级别?
答案 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),而是使用新值调用该函数或从函数返回它。
容易腻......: - )