计算列表中项目的出现次数(Erlang)

时间:2015-04-13 22:09:30

标签: function recursion erlang list-comprehension

我已经在使用Haskell两周了,并且已经在Haskell中编写了一些函数。我听说Erlang非常相似(因为它们都是主要的功能)所以我想我会翻译其中的一些函数来看看我是否可以让它们在Erlang中工作。但是我在编写这个函数的语法时遇到了问题。此函数的目的是简单地获取一个字符或int并遍历列表。在它通过列表后,我只是想计算项目发生的次数。这是一个示例运行它应该返回以下内容。

 count (3, [3, 3, 2, 3, 2, 5])  ----> 3
 count (c, [ a, b, c, d]) ----> 1

每当我运行我的代码时,它只是不断吐出语法问题,而且在Erlang中实际上是一个痛苦的调试。这是我写的代码:

count(X,L) ->
  X (L:ls) ->
  X == L = 1+(count X ls);
  count X ls.

我可以做些什么来解决这个问题?

2 个答案:

答案 0 :(得分:7)

目前还不清楚你的目标是什么,因为你的语法相当遥远。但是,您可以通过以下方式完成呼叫:

count(Needle, Haystack) -> count(Needle, Haystack, 0).

count(_, [], Count) -> Count;
count(X, [X|Rest], Count) -> count(X, Rest, Count+1);
count(X, [_|Rest], Count) -> count(X, Rest, Count).

详细说明一下,您正在创建一个名为count的递归函数,以在Needle中查找Haystack的实例。每次调用都需要考虑3种情况:基本情况,您搜索整个列表;您搜索的值与列表中的第一项匹配的情况;以及您搜索的值与列表中的第一项不匹配的情况。每个案例都是一个单独的函数定义:

count(_, [], Count) -> Count;

匹配Haystack(即您正在扫描的列表)为空的情况。这意味着您不必再搜索,并且可以返回您在列表中找到您要搜索的值的次数。

count(X, [X|Rest], Count) -> count(X, Rest, Count+1);

匹配您要搜索的值X与列表中的第一项匹配的情况。您希望继续在列表中搜索更多匹配项,但在再次调用count之前递增计数器。

count(X, [_|Rest], Count) -> count(X, Rest, Count).

匹配您正在搜索的值匹配列表头部的情况。在这种情况下,您会继续扫描列表的其余部分,但是不要递增计数器。

最后,

count(Needle, Haystack) -> count(Needle, Haystack, 0).

是一个帮助器,它调用函数的三参数版本,初始计数为0

答案 1 :(得分:2)

在Erlang中使用列表理解:

Elem = 3,
L = [3, 3, 2, 3, 2, 5],

length([X || X <- L, X =:= Elem]) %% returns 3