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)

 


Autori[ ZADANIE | AKO ZAČAŤ | RIEŠENIE ]
Posledná aktualizácia 4. 9. 2001
back  home  next