Diese Funktion zuerst aufgerufen wird:
merge(Xs,Ys) -> lists:reverse(mergeL(Xs,Ys,[])).
Die leere Liste [], um Mergel übergeben wird, der Speicher - das ist, wo die Antwort kommen soll. Beachten Sie, dass die erste Funktion mergeL aufruft - die linke Zusammenführung.
Lassen Sie uns so tun, als diese Funktion als so genannt wird:
merge([1, 2, 3], [a, b, c])
zwei Listen der gleichen Länge. Diese erste Funktion ruft dann mergeL auf:
mergeL([X|Xs],Ys,Zs) -> mergeR(Xs,Ys,[X|Zs]);
mergeL([],[],Zs) -> Zs.
Es gibt 2 Klauseln in der linken Zusammenführung. Der Aufruf von mergeL mit Argumenten stimmt mit diesen Klauseln in umgekehrter Reihenfolge überein.
Die zweite dieser Klauseln hat drei Parameter - die ersten beiden sind leere Listen []. Wenn MergeL das erste Mal aufgerufen wird, sind diese zwei Listen nicht leer, sie sind die Listen Xs und Ys, so dass die erste Klausel übereinstimmt.
Lets brechen die Spiele. Dies ist der Aufruf von Mergel:
Mergel ([1, 2, 3], [a, b, c], [])
und es passt die erste Klausel in der folgenden Art und Weise:
X = 1
Xs = [2, 3]
Ys = [a, b, c]
Zs = []
Dies ist wegen der besonderen Form der Liste:
[X | Xs]
das bedeutet Spiel X auf den Kopf der Liste (ein Einzelstück) und machen Xs der Schwanz der Liste (eine Liste).
Wir bauen dann den neuen Funktionsaufruf auf. Wir können den Wert X am Anfang der Liste Zs auf die gleiche Art und Weise wie wir Muster angepasst haben, so dass wir den ersten mergeR-Aufruf erhalten:
mergeR ([2, 3], [a, b, c], [ 1])
Das letzte Argument ist eine Ein-Punkt-Liste, die durch Hinzufügen eines Elements am Anfang einer leeren Liste verursacht wird.
Dies zieht sich bis zum Ende durch.
Eigentlich ist die Endklausel von mergeL redundant. Per Definition wird diese Funktion im letzten Satz von mergeR erschöpfen (aber ich werde das als Übung für den Leser belassen).
Dies ist eine großartige Möglichkeit, um zu visualisieren, wie es funktioniert. – marcc