Mar*_*len 6 erlang list-comprehension
实现一个Erlang列表理解,它从列表中获取两个元素并创建一个新的列表列表.
我有这个代码
pair([], Acc) -> lists:reverse(Acc);
pair(L, Acc0) ->
[ A, B | T ] = L,
Acc = [ [A, B] | Acc0 ],
pair(T, Acc).
Run Code Online (Sandbox Code Playgroud)
哪个工作正常:
7> l:pair(lists:seq(1,6), []).
[[1,2],[3,4],[5,6]]
Run Code Online (Sandbox Code Playgroud)
但似乎我应该能够将其作为列表理解来实现.我的二郎福太弱了,无法想出来.
有什么建议?
谢谢
不,列表理解不是一个很好的方法,根据定义,它们只能在一个元素上工作.在您的代码中,实际上不需要使用累加器,速度差异很小,在这里,没有它就会变得更清晰.我至少这么认为.
pairs([A,B|L]) ->
[[A,B]|pairs(L)];
pairs([]) -> [].
Run Code Online (Sandbox Code Playgroud)
列表理解会很笨重,因为它不可避免地必须对列表的每个元素做一些事情。因此,要创建列表理解,您必须尝试找出您正在谈论的元素是偶数还是奇数。这是我正在谈论的内容的一个想法:
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].
Run Code Online (Sandbox Code Playgroud)
这个的时间复杂度可能是可怕的,因为据我所知,Erlang 没有以任何方式优化它。
我不认为你的职能有什么问题,你应该坚持下去。