Základom môže byť všeobecná schéma spracovania na ľubovolnej úrovni.
Vždy zisťujem maximálne párne číslo z s-výrazu vľavo (first) a vpravo (rest) a vyberám maximum. Jedným z možných riešení je, že v našej hlavnej funkcií použijeme funkciu mymax, vracajúcu maximálne číslo spomedzi 2 argumentov. Pričom medzi argumentmi môžu byť aj iné prvky ako len čísla. Ak nebude mať na vstupe žiadne číslo môže vrátiť napríklad NIL. To zabezpečí korektné fungovanie aj v prípade, že v podvýraze s-výrazu nebude žiadne číslo.
(defun mymax (a b)
(cond ((AND (NUMBERP a) (NUMBERP b)) (max a b))
((NUMBERP a) a)
((NUMBERP b) b)
(T NIL)
)
)
; V hlavnej funkcií maxpc v cond za (ATOM sv) nemôžem
; vracať 0, pretože ak by v zozname bolo
; napr. maximálne číslo -1, potom by sa miesto neho zobrala táto
; nula, ktorá vlastne v zozname ako číslo nie je.
(defun maxpc (sv)
(cond ((AND (NUMBERP sv) (EVENP sv)) sv)
((ATOM sv) NIL)
(T (mymax (maxpc (first sv)) (maxpc (rest sv))))
)
)
; Príklady:
(maxpc '(1 2 (3 4 (5 6 7)) 5)) ; -> 6
(maxpc '(-8 (-9 -10) ((-1)))) ; -> -8