2016-08-06 41 views
-1

Ich versuche, ein Problem zu lösen (für die Praxis), in dem ich eine Funktion schreiben muss, die alle Elemente in einer bestimmten Liste von Listen verkettet. Mit anderen Worten, wenn der Eingang für diese Funktion [[1,2], [3,4]] ist, dann sollte der Ausgang [1,2,3,4] sein (Reihenfolge ist nicht wichtig).Verketten Liste von Listen

Ich konnte es erreichen, indem ich den Code unten verwendete, aber ich frage mich, ob es ineffizient ist oder eleganter gemacht werden kann.

%% To achieve this, we use a helper function and an accumulator %% 
% Append elements of Src list into Dest list 
append_list([], Dest) -> Dest; 
append_list([H|T], Dest) -> append_list(T, [H|Dest]). 

concatenate_acc([H|T], FinalList) -> 
    FinalList1 = append_list(H, FinalList), 
    concatenate_acc(T, FinalList1); 
concatenate_acc([], FinalList) -> FinalList. 

concatenate(L) -> concatenate_acc(L, []). 

Beispielausgabe:

exercises2:concatenate([[1,2], [3,4]]). 
[2,1,3,4] 

Kommentar Bitte auf diesem!

+0

Machst du das, um diese Funktion zu lernen oder nur irgendwo zu benutzen? Wenn es nur benutzt wird, gibt es 'Listen: concat/1'. – Dogbert

+0

@Dogbert Es ist zum Lernen. Lassen Sie mich das auch zum Text hinzufügen! – dotslash

Antwort

1

Mit Blick auf die source code von lists:append/1 gibt genau das, was Sie brauchen, aber auf eine einfachere Weise, denke ich.

append([E]) -> E; 
append([H|T]) -> H ++ append(T); 
append([]) -> []. 

Es ist immer eine gute Praxis, einen Blick auf den Quellcode zu nehmen, wenn es bereits eine implementierte Funktion in Erlang-Modulen.

Sie können eine kleine Änderung vornehmen, um eine Tail-Rekursion zu erstellen. Beachten Sie, dass sich der Akku Acc auf der rechten Seite des ++ Operators befindet.

append2(List) -> append2(List,[]). 
append2([], Acc) -> Acc; 
append2([H|T],Acc) -> append2(T, H ++ Acc). 
+0

Danke! Aber ist die "++" Art, Listen zu verbinden, nicht ineffizient? Joes Buch empfiehlt ausdrücklich dagegen. – dotslash

+0

AFAIK ist es ähnlich. Schauen Sie sich auch das Kapitel [List List Handling] an (http://erlang.org/doc/efficiency_guide/listHandling.html#id68235). Das einzige, was Sie beachten müssen, wenn Sie '++' verwenden, ist, dass es immer besser ist, an den Anfang von 'Acc' anzuhängen. Siehe meine Bearbeitung. –

+0

Danke! Wenn Sie sagen, an den Anfang des Akkumulators anhängen, meinst du, die '++' sollte die erste Aussage oder etwas anderes sein? – dotslash