2017-11-13 3 views
0

Ich brauche Hilfe mit einem Problem: Ich kann nicht umgehen, wie man das erste Atom aus der Liste in SCHEME-Sprache bekommt. Ich denke, ich sollte eine Schleife machen, etwas wie "while" und jedes Element auf Boolean (? Atom) vergleichen und das erste übereinstimmende Element drucken. Leider ist es schwierig für mich, Schema-Syntax zu behandeln. Bitte, können Sie irgendeine Lösung für mich vorschlagen?Schema: Wie man das erste Atom aus der Liste bekommt

define func ?atom: 
(define (atom? x) (not (or (pair? x) (null? x)))) 

Antwort

0

Rekursion ist nicht so verschieden von der üblichen Art, Probleme zu lösen - Sie müssen nur vorsichtig sein und einige sinnvolle Basisfälle festlegen. Zum Beispiel, wie würden Sie dieses Problem in Java lösen? indem wir alle Listen durchlaufen und stoppen, wenn entweder 1) wir das Element gefunden haben, das der Bedingung entspricht, oder 2) es gibt keine weiteren Elemente. Das ist genau das, was wir tun müssen:

(define (first-atom lst) 
    (cond ((null? lst) #f)   ; there are no more elements in the list 
     ((atom? (car lst))   ; current element is an atom 
     (car lst))    ; return it 
     (else      ; otherwise 
     (first-atom (cdr lst))))) ; look in the rest of the list 

Es funktioniert wie erwartet:

(first-atom '((2) 42 (3))) 
=> 42 
(first-atom '((1) (2)(3))) 
=> #f 
+1

Vielen Dank! Ihre Lösung ist sehr hilfreich – Artem

0

In Ihrer Frage haben Sie die Definition atom? die #t zurück, wenn das Argument ein Atom ist und #f anders.

Die Funktion sollte die leere Liste behandeln. z.B. Was soll passieren, wenn Sie dies tun:

(first-atom '()) 

So müssen Sie prüfen, ob das Argument die leere Liste ist und zurück, was Sie zurückkommen soll, wenn es keine Atome in den Argumenten sind. Dann haben Sie einen else Ausdruck, der den Rest erledigt.

Sie können first verwenden, um das erste Element zu überprüfen, ob es ein Atom ist, und es dann zurückzugeben, oder Sie ermitteln mit der rest der Liste.

Jetzt ist hier etwas sehr ähnlich, die die Anzahl von Elementen in einer Liste findet:

(define (length lst) 
    (if (null? lst) 
     0       ; obviously a 0 length list 
     (+ 1 (length (cdr lst))))) ; obviously one plus whatever length the rest is 

Stellen Sie sich vor, was passiert, wenn Sie (length '(1 2)) tun. Es tut (+ 1 (length '(2))) was wiederum (+ 1 (+ 1 (length '()))) was wiederum (+ 1 (+ 1 0)) tut. So einfach ist das. Alle Schleifen sind rekursive Funktionen in Scheme.

Sie verweisen auf while weist darauf hin, dass Sie mit anderen Programmiersprachen vertraut sein könnten. Ich kannte C, C++, Pascal, Perl, PHP und Java, als ich anfing, Lisp zu lernen, und ich erkannte plötzlich alle Sprachen, die ich kannte, waren nur subtile Dialekte einer Sprache, Algol. Ich habe meine sechste Sprache nicht gelernt, aber meine zweite. Scheme hat keine while-Schleife. Es hat Rekursion. Sie müssen get a book und beginnen auf der ersten Seite, als ob Sie überhaupt nicht programmieren konnten, da Assimilation von Algol Sie in die falsche Richtung weist.

+0

Ja, ich bin vertraut mit Java und C#. Ja, ich weiß, dass das Schema nicht so ist wie bei den Sprachen und die Loops basieren auf Rekursion, aber es ist wirklich schwer, anders zu denken. Vielen Dank für die Antwort! Wenn Sie können, werde ich dankbar sein, wenn Sie mir eine vollständige Lösung geben können, die ich debuggen und besser verstehen kann, was vor sich geht. – Artem

Verwandte Themen