Exe*_*e21 0 erlang recursion list-comprehension function
我已经和Haskell搞乱了两个星期,并且在Haskell中编写了一些函数.我听说Erlang非常相似(因为它们都是主要的功能)所以我想我会翻译其中的一些函数来看看我是否可以让它们在Erlang中工作.但是我在编写这个函数的语法时遇到了问题.此函数的目的是简单地获取一个字符或int并遍历列表.在它通过列表后,我只是想计算项目发生的次数.这是一个示例运行它应该返回以下内容.
count (3, [3, 3, 2, 3, 2, 5]) ----> 3
count (c, [ a, b, c, d]) ----> 1
Run Code Online (Sandbox Code Playgroud)
每当我运行我的代码时,它只是不断吐出语法问题,而且在Erlang中实际上是一个痛苦的调试.这是我写的代码:
count(X,L) ->
X (L:ls) ->
X == L = 1+(count X ls);
count X ls.
Run Code Online (Sandbox Code Playgroud)
我能解决这个问题的任何想法吗?
目前还不清楚你的目标是什么,因为你的语法相当遥远.但是,您可以通过以下方式完成呼叫:
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).
Run Code Online (Sandbox Code Playgroud)
详细说明,您正在创建一个名为in的count实例的递归函数.每次调用都需要考虑3种情况:基本情况,您搜索整个列表; 您要搜索的值与列表中的第一项匹配的情况; 以及您要搜索的值与列表中的第一项不匹配的情况.每个案例都是一个单独的函数定义:NeedleHaystack
count(_, [], Count) -> Count;
Run Code Online (Sandbox Code Playgroud)
匹配Haystack(即您正在扫描的列表)为空的情况.这意味着您不必再搜索,并且可以返回您在列表中找到要搜索的值的次数.
count(X, [X|Rest], Count) -> count(X, Rest, Count+1);
Run Code Online (Sandbox Code Playgroud)
匹配您要搜索的值X与列表中的第一个项匹配的情况.您希望继续在列表中搜索更多匹配项,但在count再次调用之前增加计数器.
count(X, [_|Rest], Count) -> count(X, Rest, Count).
Run Code Online (Sandbox Code Playgroud)
匹配您要搜索的值与列表头部不匹配的情况.在这种情况下,您继续扫描列表的其余部分,但不增加计数器.
最后,
count(Needle, Haystack) -> count(Needle, Haystack, 0).
Run Code Online (Sandbox Code Playgroud)
是一个帮助器,它调用函数的三参数版本,初始计数为0.