如何计算列表中项目的出现次数?
How to count occurence of an item in a list?
我已经用 Haskell 搞了两个星期了,并且有一些函数是用 Haskell 写的。我听说 Erlang 非常相似(因为它们都主要是函数式的)所以我想我会翻译其中的一些函数,看看我是否能让它们在 Erlang 中工作。但是,我在编写此函数的语法时遇到了麻烦。这个函数的目的是简单地获取一个字符或 int 并遍历一个列表。在它通过列表后,我只是想计算该项目出现的次数。这是一个示例 运行 它应该 return 以下内容。
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.
我可以做些什么来解决这个问题?
不清楚你要做什么,因为你的语法太离谱了。但是,您可以通过以下方式完成通话:
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
的递归函数,以在 Haystack
中查找 Needle
的实例。每次调用时,需要考虑 3 种情况:基本情况,您已经搜索了整个列表;您要搜索的值与列表中的第一项匹配的情况;以及您要搜索的值与列表中的第一项不匹配的情况。每个case都是一个单独的函数定义:
count(_, [], Count) -> Count;
匹配 Haystack
(即您正在扫描的列表)为空的情况。这意味着您不必再进行搜索,并且可以 return 您在列表中找到要搜索的值的次数。
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
的函数的三参数版本的助手。
在 Erlang 中使用列表理解:
Elem = 3,
L = [3, 3, 2, 3, 2, 5],
length([X || X <- L, X =:= Elem]) %% returns 3
我已经用 Haskell 搞了两个星期了,并且有一些函数是用 Haskell 写的。我听说 Erlang 非常相似(因为它们都主要是函数式的)所以我想我会翻译其中的一些函数,看看我是否能让它们在 Erlang 中工作。但是,我在编写此函数的语法时遇到了麻烦。这个函数的目的是简单地获取一个字符或 int 并遍历一个列表。在它通过列表后,我只是想计算该项目出现的次数。这是一个示例 运行 它应该 return 以下内容。
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.
我可以做些什么来解决这个问题?
不清楚你要做什么,因为你的语法太离谱了。但是,您可以通过以下方式完成通话:
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
的递归函数,以在 Haystack
中查找 Needle
的实例。每次调用时,需要考虑 3 种情况:基本情况,您已经搜索了整个列表;您要搜索的值与列表中的第一项匹配的情况;以及您要搜索的值与列表中的第一项不匹配的情况。每个case都是一个单独的函数定义:
count(_, [], Count) -> Count;
匹配 Haystack
(即您正在扫描的列表)为空的情况。这意味着您不必再进行搜索,并且可以 return 您在列表中找到要搜索的值的次数。
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
的函数的三参数版本的助手。
在 Erlang 中使用列表理解:
Elem = 3,
L = [3, 3, 2, 3, 2, 5],
length([X || X <- L, X =:= Elem]) %% returns 3