Schema: Wie um zu überprüfen, ob alle Elemente einer Liste sind identisch
Ich möchte erstellen Sie eine Scheme-Funktion ergibt true, wenn es übergeben wird eine Liste, die aus vollständig identischen Elemente. Eine solche Liste wäre '(1 1 1 1). Es ergäbe false mit so etwas wie '(1 2 1 1).
Dies ist, was ich habe, so weit:
(define (list-equal? lst)
(define tmp (car lst))
(for-each (lambda (x)
(equal? x tmp))
lst)
)
Dies ist eindeutig falsch, und ich bin neu in diesem. Ich denke, ich bin nicht in der Lage zu äußern, der Schritt, wo ich soll zurück #t
oder #f
.
Vielen Dank im Voraus!
BEARBEITEN:
Ich fummelte ein wenig und fand eine Lösung, die scheint sehr gut zu funktionieren, und mit einer minimalen Menge an code:
(define (list-equal? lst)
(andmap (lambda (x)
(equal? x (car lst)))
lst))
Nochmals vielen Dank für die Hilfe an alle.
InformationsquelleAutor Joseph | 2011-09-06
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Minimale Menge an code, die, wenn Sie nicht kümmern, dass es funktioniert nur für zahlen:
Beispiele:
(equal?)
ohne Argumente =>#t
.equal?
. Ich denke, ich werde das beheben, dass für @aaz.equal?
ist nicht variadic den Weg=
ist. 🙂 (Getestet habe ich mit Schläger, zum Beispiel: "gleich?: erwartet 2 Argumente, die 3: 1 2 3") Du gehst zu haben, um mit dem Falzen, sorry. 😛Den
andmap
Lösung ist schön, aber wennandmap
nicht verfügbar ist, können Sie diese verwenden. Es nutzt grundlegende Operationen (und, oder, null-check, überprüfung auf Gleichheit) und Griffe leere Listen und eine element-Listen. Ähnlich wie Sean der Umsetzung, aber kein Helfer definition ist notwendig.(or 1 2 3)
ist auch legal.Probieren Sie etwas wie dieses:
Dies ist vielleicht nicht die sauberste Umsetzung, aber ich denke, es wird richtig behandelt Fälle von leeren Listen und one-element-Listen.
In R6RS es gibt die
for-all
- Funktion, die nimmt ein Prädikat und eine Liste, und zurück#t
wenn das Prädikat liefert true für alle Elemente in der Liste und#f
sonst, das ist genau das, was Sie hier benötigen.Also, wenn Sie mit R6RS (oder jedes andere scheme-Dialekt, der hat die
for-all
- Funktion), können Sie einfach ersetzenfor-each
mitfor-all
im code und es wird funktionieren.lst
ist nicht leer.tmp
variable und rufen Sie(car lst)
jedes mal, wenn im Prädikat (die nie aufgerufen werden, für die leere Liste dieses problem zu vermeiden).cdr
von der leeren Liste. Für Ihre Umsetzung ist, sollten Sie zuerst prüfen oblst
ist nichtnull
und dann(cdr lst)
ist nichtnull
.Etwas wie dies funktionieren sollte:
(or (null? lst) (null? (cdr lst)))
wäre, hätte es viel bessere Laufzeit, als auch als schön und prägnant.Die anderen Antworten in diesem thread scheinen alle zu kompliziert (ich lese Sie alle), also hier ist mein nehmen auf Sie:
(Es funktioniert nicht mit einer leeren Liste, von design. Es ist einfach zu fügen Sie eine
(if (null? lst) #t ...)
wenn nötig.)Kurze, prägnante Lösung:
Beachten Sie, dass diese Schläger verwendet, so kann dies nicht funktionieren mit Ihrem scheme-Implementierung.
Noch eine andere Lösung:
Ist schlecht in diesen Sprachen. Versuchen