首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Erlang :如何实现Erlang列表理解?

Erlang :如何实现Erlang列表理解?
EN

Stack Overflow用户
提问于 2012-06-22 05:04:36
回答 2查看 955关注 0票数 6

实现一个Erlang列表理解,它从一个列表中获取两个元素,并生成一个新的列表列表。

我有这个代码

代码语言:javascript
复制
pair([], Acc) -> lists:reverse(Acc);

pair(L, Acc0) -> 
    [ A, B | T ] = L,
    Acc = [ [A, B] | Acc0 ],
    pair(T, Acc).

它工作得很好:

代码语言:javascript
复制
7> l:pair(lists:seq(1,6), []).  
[[1,2],[3,4],[5,6]]

但看起来我应该能够将其作为列表理解来实现。我的二郎夫太虚弱了,拿不出来。

有什么建议吗?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2012-06-22 07:16:40

不,列表理解不是一种好的方法,根据定义,它们一次只能处理一个元素。在你的代码中,真的不需要使用累加器,速度上的差异很小,here,没有它会变得更清楚。至少我是这么认为的。

代码语言:javascript
复制
pairs([A,B|L]) ->
    [[A,B]|pairs(L)];
pairs([]) -> [].
票数 8
EN

Stack Overflow用户

发布于 2012-06-22 05:26:27

列表理解将是笨重的,因为它不可避免地必须为列表中的每个元素做一些事情。要创建列表理解,您必须尝试找出您正在与之交谈的是偶数元素还是奇数元素。这是我正在谈论的一个想法:

代码语言:javascript
复制
pair(L) ->
    L2 = lists:zip(lists:seq(1, length(L)), L),
    [[A, B] || {Ai, A} <- L2, {Bi, B} <- L2,
          Ai rem 2 == 1, Bi rem 2 == 0, Ai + 1 == Bi].

这个问题的时间复杂性可能是可怕的,因为据我所知,Erlang没有以任何方式优化这一点。

我不认为你的函数有任何问题,你应该坚持下去。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11146737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档