Beim Reduzieren wendest du wiederholt eine Funktion auf jedes Element einer Sequenz an und sammelst die Ergebnisse auf irgendeine Weise. Die angewendete Funktion nimmt zwei Parameter: den aktuellen gesammelten Wert und das zu verarbeitende Element. Sie muss den neuen gesammelten Wert ergeben.
In Common Lisp erledigst du das mit der Funktion reduce. In ihrer einfachsten Form sieht sie so aus:
(reduce #'function-to-apply sequence :initial-value value)
Beachte, dass ein Anfangswert angegeben wird. Dieser ist der „aktuelle gesammelte Wert“, der an die Funktion übergeben wird, wenn das erste Element verarbeitet wird.
Hier ist ein Beispiel, das die Zahlen der Liste addiert und dabei mit einem Anfangswert von 10 beginnt:
(reduce #'+ '(1 2 3 4) :initial-value 10) ; => 20
Beachte: Wenn die Sequenz leer ist, wird die Funktion nie aufgerufen und der Ausdruck ergibt den Anfangswert.
Logan, das Lisp-Alien, mag Zahlen und mag es außerdem, Dinge zu ordnen.
Logan bittet dich, ihm zu helfen: Du sollst eine Funktion schreiben, die eine Liste von Zahlen entgegennimmt und daraus ein Paar aus zwei Listen macht. Die erste enthält alle ungeraden Zahlen, die zweite alle geraden.
Zuerst brauchst du eine Funktion, die ein Paar aus zwei Listen und eine Zahl entgegennimmt und die Zahl in die richtige Teilliste einsortiert, je nachdem, ob sie ungerade oder gerade ist:
(categorize-number '((1) . (2)) 23) ; => ((23 1) . (2))
(categorize-number '((1) . (2)) 42) ; => ((1) . (42 2))
Jetzt kannst du mit der Funktion, die du gerade geschrieben hast, eine weitere Funktion schreiben, die eine Liste von Zahlen entgegennimmt und sie so kategorisiert wie oben:
(partition-numbers '(1 2 3 4)) ; => ((3 1) . (4 2))
(partition-numbers '(42 31 24 13)) ; => ((13 31) . (24 42))
Melde dich bei Exercism an, um Common Lisp mit 27 Konzepte92 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.