A redukálás során egy függvényt alkalmazunk ismételten egy sorozat minden elemére, az eredményeket pedig valamilyen módon akkumuláljuk. Az alkalmazott függvény két paramétert kap: az aktuális akkumulált értéket és a feldolgozandó elemet. Az eredményének az új akkumulált értéknek kell lennie.
Common Lispben ezt a folyamatot a reduce függvény végzi.
A legegyszerűbb formájában így néz ki:
(reduce #'function-to-apply sequence :initial-value value)
Figyeld meg, hogy meg van adva egy kezdőérték: ez lesz az „aktuális akkumulált érték”, amelyet a függvény megkap, amikor az első elemet feldolgozza.
Íme egy példa, amely összeadja a lista számait, 10-es kezdőértékről indulva:
(reduce #'+ '(1 2 3 4) :initial-value 10) ; => 20
Vedd figyelembe, hogy ha a sorozat üres, a függvény soha nem hívódik meg, és a forma értéke az initial-value lesz.
Logan, a Lisp-űrlény szereti a számokat, és a rendszerezést is kedveli.
Arra kér, hogy segíts neki megírni egy függvényt, amely átvesz egy számokból álló listát, és előállít két lista párját: az elsőben a páratlan számok, a másodikban a páros számok vannak.
Először létre kell hoznod egy függvényt, amely átvesz két lista egy párját és egy számot, majd a számot a megfelelő allistába teszi aszerint, hogy páratlan vagy páros:
(categorize-number '((1) . (2)) 23) ; => ((23 1) . (2))
(categorize-number '((1) . (2)) 42) ; => ((1) . (42 2))
Most az imént létrehozott függvénnyel írhatsz egy másik függvényt is, amely átvesz egy számokból álló listát, és ugyanúgy kategorizálja őket, ahogy fent tetted:
(partition-numbers '(1 2 3 4)) ; => ((3 1) . (4 2))
(partition-numbers '(42 31 24 13)) ; => ((13 31) . (24 42))
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Common Lisp nyelvet 27 fogalom92 feladat segítségével, valódi emberi mentorálással, mindez ingyen.