Možným riešením je použiť dve funkcie zruš zruší daný prvok zo zoznamu a maxim nájde maximum, čo bude ten prvok ktorý ako argument odovzdá funkcií zruš na zrušenie. Kvôli pohodlnej inicializácií môžeme obe funkcie volať ešte z ďalšej (hlavnej) funkcie.
; Táto implementácia zrus, zruší prvý výskyt prvku.
; Predpokladáme, že v postupnosti sa číslo ktoré mám zrušiť neopakuje.
; Respektíve, že maximum bude len jedno. Ak by sa malo
; opakovať, treba pozmeniť funkciu zrus, aby zrušila všetky výskyty prvku.
; V akcia pri 2 podmienke v cond by potom malo miesto (rest zoz)
; byť (zrus c (rest zoz)).
(defun zrus (c zoz)
(cond ((null zoz) NIL)
((= c (first zoz)) (rest zoz))
(T (cons (first zoz) (zrus c (rest zoz))))
)
)
; Výhodne použitie je inicializovať maxim prvým prvkom a nechať
; ju hľadať vo zvyšku.
(defun maxim (max zoz)
(cond ((null zoz) max)
((< max (first zoz)) (maxim (first zoz) (rest zoz)))
(T (maxim max (rest zoz)))
)
)
; Predpokladáme, že postupnosť čísel je neprázdna, kvôli inicializácií
; funkcie maxim. Ak by mala byt prázdna možno vo funkcií zrusmax
; pridať ešte test tejto možnosti.
; Hlavná funkcia.
(defun zrusmax (zoz)
(zrus (maxim (first zoz) (rest zoz)) zoz)
)
; Príklad:
(zrusmax '(4 1 2 6 5)) -> (4 1 2 5)