DrRacket Schleifen zum durchsuchen von listen

S-Force

Ensign
Registriert
Nov. 2007
Beiträge
238
Hallo,

ich programmiere momentan in racket einer funktionalen Programmiersprache und habe das Problem das ich Objektorientierung gewöhnt bin.

Momentan stehe ich vor dem Problem das in einer Liste Objekte verglichen werden sollen via <=.
In der Objektorierntierung ist dies ja ganz einfach in dem man einer Variablen immer einen neuen Wert zuweißt via If.

In Racket sollte man wie ich es verstanden habe jedoch rekursiv die Liste durchlaufen.
Leider finde ich keine Möglichkeit den zweiten Wert einer Liste aufzurufen.

Der erste Wert ist ja noch recht einfach
Code:
(first name-der-liste)
Den rest ruft man dann wie folgt auf.
Code:
(rest name-der-liste)

Kennt sich hiermit jemand aus und weiß wie ich aus dem rest der Liste das erste Objekt bekomme?
 
S-Force schrieb:
In Racket sollte man wie ich es verstanden habe jedoch rekursiv die Liste durchlaufen.
Leider finde ich keine Möglichkeit den zweiten Wert einer Liste aufzurufen.

Ich weiß noch nicht was Du willst, aber werde trotzdem schon mal antworten.
Also nehmen wir mal an Du hast eine Liste:
Code:
(define name-der-liste (list 4 5 6))

So ergibt
Code:
(first name-der-liste)
den sklaren Wert 4
und
Code:
(rest name-der-liste)
logischerweise wieder eine Liste: '(5 6)
Willst Du davon wieder den ersten Wert rufst Du wieder first auf.
Code:
(first (rest name-der-liste))
ergibt also 5

S-Force schrieb:
Kennt sich hiermit jemand aus und weiß wie ich aus dem rest der Liste das erste Objekt bekomme?

Da <= eine ganz normale Funktion ist, kannst Du die direkt auf beliebig lange Listen anwenden:
Code:
(apply <= name-der-liste)
Ergibt in unserem Beispiel #t (true) also 'wahr'
Bei
Code:
(apply <= '(4 6 5))
würde #f (false) rauskommen, da 6 vor 5 steht aber größer ist.

Das ist ist halt das coole an LISP, dass die meisten Funktionen nicht auf zwei Operanden beschränkt sind.

Ich hoffe, ich habe Dein Problem richtig verstanden. Ansonsten hake gerne nochmal nach.

Gruß
MichaelK
 
hallo,

danke für die antwort hatte es eben auch schon herausgefunden wie man auf das 2 objekt der liste zugreift.

Prinzipiell ist es richtig das ich die Elemente alle vergleichen will.
Nur möchte ich nicht den Ausgabewert #f oder #t sondern den kleinsten wert der liste.
Deswegen wollte ich objekt 1 mit 2 vergleichen und wenn es kleiner ist mit dem nächsten usw...

Beispiel:

Code:
(define list (5 3 1 2))

5>3? -> funktion rekursiv aufrufen mit 3
3>1? -> funktion rekursiv aufrufen mit 1
1>2? -> funktion rekursiv aufrufen mit 1

und dann greift die empty abfrage
 
Versuch mal den Pseudocode aufzustellen, in Head/Tail-Logik.

(define (list-min l) (if (<a> (<b> (<c> l))) (min (<d> l) (list-min (<c> l))) (<d> l))), die richtigen Operationen findest Du bestimmt ;)
 
S-Force schrieb:
Prinzipiell ist es richtig das ich die Elemente alle vergleichen will.
Nur möchte ich nicht den Ausgabewert #f oder #t sondern den kleinsten wert der liste.
Deswegen wollte ich objekt 1 mit 2 vergleichen und wenn es kleiner ist mit dem nächsten usw...

Beispiel:

Code:
(define list (5 3 1 2))

5>3? -> funktion rekursiv aufrufen mit 3
3>1? -> funktion rekursiv aufrufen mit 1
1>2? -> funktion rekursiv aufrufen mit 1

Ok. Im prinzip könntest Du das auch klassisch imperativ mit for-each lösen. Aber das nur als Hinweis nebenbei.

Rekursiv könnte man das Ganze so lösen:
Code:
(define (den-kleinsten liste)
    (cond
          ; nur ein Element in der Liste? falls ja genau dieses
          ; Element zurückgeben
          [(null? (rest liste)) (first liste)]
          ; vergleiche den ersten der übergebenen Liste mit dem
          ; kleinsten der Rest der Liste
          ; falls Erster von 'liste' kleiner ist gibt ihn zurück
          [(< (first liste) (den-kleinsten (rest liste))) (first liste)]
          ; Ansonsten: den kleinsten der restl. Liste ermitteln (rek.)
          [else (den-kleinsten (rest liste))]
    )
)

Code:
(den-kleinsten '(9 4 9 12 5))
ergibt dann 4.

S-Force schrieb:
und dann greift die empty abfrage
Könnte man noch einbauen, um auf leere Listen zu reagieren. So gibts ne contract violation.

Gruß
Andy
 
Zurück
Oben