【问题标题】:Erlang: Identifying the max element in a listErlang:识别列表中的最大元素
【发布时间】:2014-11-09 12:11:17
【问题描述】:

我对 Erlang 有点陌生,但这里是。我想创建一个辅助函数,它采用列表中的最大正整数并返回该值。我在代码中的处理方法如下:

-module(function).
-export([normalize/1]).

    normalize(List) -> normalize(List, 0).

    normalize([], N) -> N;                                
    ​normalize([H|T], N) when H > N -> normalize(T, H==N).

我在最后一行不断收到语法错误(怀疑警卫有问题),第一行还有“function normalize/2 is undefined”。我该如何进行这项工作?

【问题讨论】:

  • H==N 返回 true 或 false,因此如果您的代码最终调用 normalize(T, true),则 true 将被“分配”给 N(实际上是与 N 匹配的模式,并且因为 N 未绑定, N 将被绑定为真)——不是你想要的。

标签: function erlang max


【解决方案1】:

我不确定您为什么在最后一行中将 H 与 N (H==N) 进行比较,但要解决您的方法,您只需将 H==N 替换为 H。这将使它适用于像 [1,2,3] 这样的列表,但对于像 [3,1,2][1,1,1] 这样的列表会失败,因为保护检查会失败。

要解决最后一种情况,您需要添加另一个带有保护检查的函数子句,例如H =< N。以您的代码为基础,这是一个完整的版本

-module(function).
-export([normalize/1]).

normalize(List) -> normalize(List, 0).

normalize([], N) -> N;
normalize([H|T], N) when H > N -> normalize(T, H);
normalize([H|T], N) when H =< N -> normalize(T, N).

但是,有一个函数可以找到列表lists:max/1 的最大元素,我强烈建议你看看它的implementation;真的很简单。

您的示例也不包含列表理解,因此我更新了问题标题和标签。最后一件事,normalize 这个名字不太适合功能用途:)。

【讨论】:

  • 看看它的实现;真的很简单。 我能想到一个更简单的实现:max([Max|T]) -&gt; max(Max, T)。等
猜你喜欢
  • 2019-11-07
  • 2011-12-15
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2015-02-25
相关资源
最近更新 更多