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.
Vielen Dank! Ihre Lösung ist sehr hilfreich – Artem