2012-06-21 15 views
6

Implementieren Sie ein Erlang-Listenverständnis, das zwei Elemente aus einer Liste aufnimmt und eine neue Liste von Listen erstellt.Erlang: Wie implementiert man Erlang Listenverständnis?

Ich habe diesen Code

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

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

die gut arbeitet:

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

aber es scheint, wie ich in der Lage sein soll, dies als eine Liste Verständnis zu implementieren. Mein Erlang-fu ist zu schwach, um darauf zu kommen.

Irgendwelche Vorschläge?

Dank

Antwort

1

Eine Liste Verständnis klobig sein wird, weil es zwangsläufig etwas für jedes Element der Liste tun müssen. Um ein Listenverständnis zu erstellen, müssen Sie also versuchen, herauszufinden, ob es sich um ein gerades oder ein ungerades Element handelt, mit dem Sie sprechen. Hier ist eine Idee von dem, was ich spreche:

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]. 

Die Zeitkomplexität auf dies ist wahrscheinlich schrecklich, weil soweit ich bin mir bewusst, Erlang dies nicht in irgendeiner Weise zu optimieren.

Ich glaube nicht, dass mit Ihrer Funktion etwas nicht stimmt und Sie sollten dabei bleiben.

8

Nein, ein Listenverständnis wäre kein guter Weg, um per Definition nur an einem Element zu arbeiten. In Ihrem Code ist es wirklich nicht nötig, einen Akkumulator zu verwenden, der Geschwindigkeitsunterschied ist klein, here, und ohne ihn wird es klarer. Ich denke schon.

pairs([A,B|L]) -> 
    [[A,B]|pairs(L)]; 
pairs([]) -> []. 
+1

Dies folgt dem Erlang Mantra "lass es crashen", z. für den Fall "[a]". – Tilman

+0

@Tilman Ja, die Funktion ** ist ** definiert, um Paare von Elementen zu übernehmen, wenn es sich also um einen Fehler handelt, wenn eine ungerade Anzahl von Elementen in der Liste enthalten ist. Sie können natürlich immer definieren, was in diesem Fall passieren soll und danach handeln. – rvirding