Finden Sie den vorletzten Punkt in der Liste, bitte erläutern Sie diese Lösung

8
%Vor%

Kann jemand Zeilen für Zeile kommentieren?

Ist das [A] ein generisches wie in c #, das wir tun würden?

h scheint nicht definiert zu sein?

Ich denke, der Hauptteil des Algo ist der rekursive Aufruf:

%Vor%

Es scheint keinen Scheck für 2 Gegenstände in der Liste zu geben und dann den ersten Gegenstand zu nehmen, um den vorletzten zu bekommen, verwirrt!

    
Blankman 30.06.2011, 19:37
quelle

4 Antworten

10

Die Schlüssel zum Verständnis der Musterübereinstimmung sind zu erkennen, dass x :: y wird nur einer Liste mit einem einzelnen Objekt x gefolgt von dem Rest der Liste y (was sein könnte nur Nil , oder könnte viele Elemente enthalten), und _ bedeutet "hier muss etwas sein, aber wir werden es nicht stören, es zu benennen". (Und dass die Übereinstimmungen der Reihe nach und die Listen mit Nil enden.)

Sie haben Recht, dass [A] ein generischer Typ ist.

Also, die erste Zeile:

%Vor%

sagt, wenn unsere Liste (konzeptionell) Node(h) -> Node(whatever) -> Nil aussieht, dann geben wir h zurück. Dies ist genau eine Zwei-Elemente-Liste mit dem ersten ausgewählten Element. Beachten Sie, dass Nil nicht mit einem beliebigen Ende der Liste übereinstimmt. Es entspricht nur dem Ende des Listeneintrags Nil . Dies liegt an einer Regel, die Scala zur Unterscheidung der beiden verwendet: Kleinbuchstaben werden als Platzhalter behandelt, die den entsprechenden Wert enthalten sollen, während Großbuchstaben als übereinstimmende Konstanten behandelt werden. (Wenn Sie einen Kleinbuchstabennamen eingeben müssen, können Sie ihn mit Backticks umgeben.)

Okay, nehmen wir jetzt an, es ist keine Liste mit zwei Elementen. Wenn es nicht leer ist, stimmt es mit

überein %Vor%

Wenn wir also keine Liste mit zwei Elementen haben, werfen wir den ersten Gegenstand weg und versuchen es erneut. Schließlich, wenn wir irgendwie nie mit einer Zwei-Elemente-Liste enden würden, kommen wir zu

%Vor%

und wir sind fertig. (Dies könnte auch case Nil sein, da dies die einzige Möglichkeit ist, die nicht mit den beiden anderen Einträgen übereinstimmt.)

    
Rex Kerr 30.06.2011, 19:43
quelle
4

A ist eine Typvariable, dh die Funktion wird generisch für jeden Typ A definiert.

h ist durch den Mustervergleich gebunden: Die ersten case -Zustände, wenn es genau zwei Elemente gibt, dann rufen Sie das erste h auf und geben es zurück.

  

Es scheint keine Überprüfung für zwei Einträge in der Liste zu geben

Es gibt: h :: _ :: Nil bedeutet "ein Element h , gefolgt von einem Element, gefolgt von keinen weiteren Elementen." Nil ist kein Element, es ist das Ende der Liste.

  

und dann den ersten Punkt nehmen, um den vorletzten

zu erhalten

Wenn Sie das erste einer Liste mit zwei Elementen verwenden , nehmen Sie den vorletzten Eintrag. Wenn die Liste weniger oder mehr Elemente als zwei enthält, gelten die anderen beiden Fälle.

    
Fred Foo 30.06.2011 19:42
quelle
3

larsmans und Rex haben deine Fragen behandelt, aber siehe Kapitel 9 für weitere Details zu '::' Ссылка

    
Darth Ninja 30.06.2011 19:47
quelle
1

Die erste Zeile bedeutet, dass jedes Listenelement h zurückgegeben wird, wenn auf h ein weiterer und ein Nil-Zeiger (am Ende der Liste) folgt. Das tatsächliche Element, das auf h folgt, ist nicht wichtig, deshalb verwenden Sie _, um anzugeben, dass ein Element vorhanden ist, aber Sie interessieren sich nicht für seinen Wert.

Wenn der erste Fall nicht übereinstimmt, wird im zweiten Fall die Rekursion aufgerufen, wenn die Liste ein Kopfelement und einen Schwanz von mindestens einem Element enthält.

Schließlich retten Sie Listen, die nur aus einem einzigen Element bestehen. Auch hier müssen Sie sich nicht um den tatsächlichen Wert des Elementwertes kümmern.

    
dlns 30.06.2011 19:47
quelle