6

リストから 2 つの要素を取り、リストの新しいリストを作成する Erlang リスト内包表記を実装します。

私はこのコードを持っています

pair([], Acc) -> lists:reverse(Acc);

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

これはうまくいきます:

7> l:pair(lists:seq(1,6), []).  
[[1,2],[3,4],[5,6]]

しかし、これをリスト内包表記として実装できるはずです。私のErlang-fuは弱すぎて思いつきません。

助言がありますか?

ありがとう

4

2 に答える 2

8

いいえ、リスト内包表記はそれを行うための良い方法ではありません。定義上、一度に 1 つの要素でしか機能しません。あなたのコードでは、実際にはアキュムレータを使用する必要はありません。ここでは速度の違いは小さく、それがないとより明確になります。少なくともそう思います。

pairs([A,B|L]) ->
    [[A,B]|pairs(L)];
pairs([]) -> [].
于 2012-06-21T23:16:40.337 に答える
1

リスト内包表記は、リストのすべての要素に対して必然的に何かをしなければならないため、扱いにくいものになります。したがって、リスト内包表記を作成するには、それが偶数要素か奇数要素かを調べなければなりません。これが私が話していることのアイデアです:

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 はこれをまったく最適化していないため、この時間の複雑さはおそらくひどいものです。

あなたの機能に問題はないと思いますし、それに固執するべきです。

于 2012-06-21T21:26:26.967 に答える