Wie kann ich die Liste von Erlangs Listen verketten, ohne das List-Modul zu verwenden?

8

Das Buch, das ich über Erlang lese, hat Übungen auf der Rückseite und man erstellt die Listen neu: append function.

Ich könnte das einfach mit dem Operator ++ tun, aber ist das nicht wirklich langsam? Und ich denke, der Sinn der Übung besteht darin, das mit Listenoperationen zu tun, die ich schreibe.

Bisher ist der einzige Ansatz, an den ich denken könnte, etwas zu tun wie:

%Vor%

Aber ich weiß, das ist falsch ...

Irgendwelche Vorschläge, wie man das macht?

EDIT: Um die Frage zu klären, hier eine Beispieleingabe und -ausgabe:

Eingabe: [[1,2,3], [], [4,5], [6]] Ausgabe: [1,2,3,4,5,6]

Nachdem ich eine Weile gearbeitet habe, kam ich auch auf diesen Code:

%Vor%

Dies funktioniert jedoch nur, wenn die Liste die Größe 3 hat. Wie kann ich das ändern, so dass es für eine beliebige Anzahl von Listen zufälliger Größe funktioniert?

    
samoz 15.07.2009, 12:33
quelle

4 Antworten

4

Sie benötigen nur zwei Parameter für Ihre Concat-Funktion, da Sie sich an einen der Parameter anhängen und das schließlich zurückgeben werden. Etwas wie (ungetestet):

%Vor%

Das ++ ist der Append-Operator, Sie müssen das tun, um effizient zu sein.

(Die Idee des Obigen ist, den linken Parameter zurückzugeben, wenn wir nicht mehr übrig sind, oder einen weiteren Aufruf, nachdem wir eines der Elemente von rechts nach links bewegt haben). Es gibt wahrscheinlich mehr Effizienz, wenn man den Append in umgekehrter Richtung durchführt und dann die Antwort schließlich umkehrt, aber hey ...)

(Ich habe gerade Ihre Bearbeitung gesehen, und meins funktioniert natürlich nur für zwei Dinge, die Sie anhängen können, aber Sie können durch die obige Funktion für jedes Element in Ihrer Liste von Listen rekursieren ...)

    
Alan Moore 15.07.2009, 13:20
quelle
14

++ ist nur langsam, wenn es falsch benutzt wird, es ist so schnell wie alles, was man mit der Hand herstellen kann. Sie müssen sicherstellen, dass Sie die Liste in der richtigen Richtung durcharbeiten, andernfalls ist der resultierende Anhang O (N ^ 2). Wenn wir X ++ Y machen, müssen wir eine Kopie von X machen und sie dann Y voranstellen, die nicht kopiert wird.

In dieser Funktion erscheint der Akkumulator auf der linken Seite von ++, so dass der Anhang nicht effizient ist.

%Vor%

Diese Funktion funktioniert viel besser, obwohl sie nicht rekursiv ist.

%Vor%

In diesem Fall ist das Rewriting als Tail Recursive nur eine bescheidene Verbesserung:

%Vor%

Die Zeiten auf einer großen Eingabeliste zeigen, wie groß die Verbesserung ist. (Die Zeiten sind in Mikrosekunden.)

%Vor%     
cthulahoops 15.07.2009 14:59
quelle
4

Ein guter Ansatz ist die Verwendung von lists:foldr ,

%Vor%

Es ist auch eine gute Übung, um Ihre eigene Faltfunktion zu schreiben ...

    
Jonas 15.07.2009 16:29
quelle
0
%Vor%     
dogwood 17.01.2016 16:45
quelle

Tags und Links