Schläger - Ausgabe Inhalt einer Liste
Ich habe eine Liste (in Racket/Scheme):
(define myList (cons 'data1 (cons 'data2 (cons 'data3 (cons 'data4 empty)))))
oder
(list 'data1 'data2 'data3 'data4)
Und ich möchte eine Funktion schreiben, die Zyklen durch die Liste und gibt alle Werte der Liste.
(define (outputListData list)
(cond
[(null? list) list]
[else (getListData)]))
Mit welcher Funktion kann ich den Zyklus durch den Inhalt der Liste? Ich weiß, man kann first
& rest
um Daten der Liste, aber ich denke, das ist nicht der richtige Weg hier.
BTW: gibt es eine gute, kompakte Schläger-Verweis wie php.net? Ich finde die offizielle Schläger docs sehr verwirrend ...
- Was findest du verwirrend über den Schläger-Dokumentation? Haben Sie schaute auf die Schläger-Handbuch unter docs.racket-lang.org/guide ? Es ist eine sanftere Einführung. Wenn Sie noch unsicher sind über Rekursion, vielleicht wollen Sie auch heraus zu überprüfen, Wie Design-Programme, die kostenlos online unter htdp.org .
InformationsquelleAutor wowpatrick | 2011-11-11
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
dyoo die Lösung ist schön und bündig in ein Schema, wie Schläger, die nützlich iteration Routinen eingebaut. Nur zur info, wenn, Ihre 'outputListData' ist nicht viel mehr als die standard-rekursive Art und Weise, dies zu tun. Sie brauchen nur zu ändern, ein paar Zeilen:
Da dies ist ein "Imperativ" Art von Verfahren, die nicht entworfen, um einen Wert zurückzugeben, ist es eigentlich egal, was wir tun mit einer leeren Liste so lange wie wir stoppen wiederkehrend (um eine Endlosschleife zu vermeiden). Wenn die Liste nicht leer ist, wir geben das erste element und starten Sie über rekursiv mit dem rest der Liste.
BTW, hier ist ein weiterer Weg, könnte man etwas schreiben fast identisch, wenn Sie brauchte nur eine "for" - Schleife in der Mitte eine andere Funktion:
Einen Weg, um darüber nachzudenken ", benannt lassen" ist, dass es definiert, eine temporäre Funktion, die aufgerufen wird
loop
, die genauso funktioniert wieoutputListData
oben. Schema hat die schöne Eigenschaft, dass es nicht wachsen die Stapel für "Schwanz" nennt, wie diese, so kann man immer schreiben, was wäre eine "iterative"for
oderwhile
Schleife in dieser rekursive Stil.Empfehle ich Der Kleine Intrigant Friedman und Felleisen, die für eine kurze Einführung zu dieser Art von Funktion zu schreiben! Ich fand es durch Douglas Crockford ' s Seite hier.
Können Sie eine for-Schleife verwenden. Beispiel:
Gibt es mehr funktionelle Möglichkeiten, dies zu tun, natürlich, aber dieser Weg funktioniert auch. Sie werden wahrscheinlich wollen, um ein lehrbuch, Wie das Design-Programmen, um die rekursive Ansatz. Siehe: http://www.ccs.neu.edu/home/matthias/HtDP2e/
Bearbeiten als pro-Kommentare: Verwenden Sie für-jeden
Versuchen Sie dies:
ZERLEGUNG:
(void x)
wird x ignoriert werden, anstatt zurückgeschickt zu REPL/übergeordneten Ausdruck, der als Wert.(map function lst)
: Eine Liste'(a1 a2 ... an)
liefert die Liste'((function a1) (function a2) ... (function an))
.Also wir verwenden anzeigen, um alle Elemente, aber da wir nur über die Nebenwirkung und nicht der Rückgabewert, nennen wir leere auf der zurückgegebenen Liste.
Offiziellen docs:
for-each
, nichtmap
Sie, wenn Sie nicht mit der return-Wert. Als bonus, Sie können tun, Weg mit dervoid
.Ich denke, die Lösung ist am einfachsten zu verstehen, um zu kommen mit einer so genannten "Liste-Esser" - Funktion. Dies ist der Weg meiner Universität eingeführt Rekursion und Listen im Schläger. Auch die meisten Bücher auf den Schläger (d.h. "How To Design Programs" (oder "Reich Der Schläger") erklären, es auf diese Weise. Dies ist der code:
Wenn Sie rufen Sie die Funktion mit der Beispiel-Liste meine-Liste, erhalten Sie die folgende Ausgabe:
Die Funktion macht Folgendes: solange die angegebene Liste ist nicht leer, Sie schnappt sich das erste element der Liste und übergibt Sie an die Funktion drucken. Dann erzählt es selbst zu tun genau das gleiche mit dem rest der Liste. (Er ruft sich selbst auf den rest der Liste.) Dieser zweite Teil ist das, was Sie rufen Rekursion.
Jedoch, Sie verkürzen kann, dass durch die Verwendung einer Funktion namens Karte:
Diese im Grunde sagt, dass Sie wollen, dass die Funktion drucken genannt zu werden, auf jedes element der übergebenen Liste. Die Ausgabe ist genau das gleiche.
Hoffe, es half!
r5rs map
verarbeiten könnte seine Argumente in unbekannter Reihenfolge. Schläger-version hat zu verarbeiten, die vom ersten bis zum letzten. --- tatsächlich, Ihreprint-list
Funktion wie(for/list print lst)
.