Možným riešením je použiť dve funkcie zruš zruší daný prvok zo zoznamu a minim nájde minimum, č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 minimum 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ť minim prvým prvkom a nechať
; ju hľadať vo zvyšku.

(defun minim (min zoz)
 (cond ((null zoz) min)
       ((> min (first zoz)) (minim (first zoz) (rest zoz)))
       (T (minim min (rest zoz)))
 )
)

; Predpokladáme, že postupnosť čísel je neprázdna, kvôli inicializácií
; funkcie minim. Ak by mala byt prázdna možno vo funkcií zrusmin
; pridať ešte test tejto možnosti.
; Hlavná funkcia.

(defun zrusmin (zoz)
 (zrus (minim (first zoz) (rest zoz)) zoz)
)

; Príklad:
(zrusmin '(4 1 2 6 5)) -> (4 2 6 5)

 


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