Inak povedané vo výslednom zozname budú všetky tie prvky, ktoré sú na najvyššej úrovni len raz.

Možným riešením je vytvoriť si funkciu, ktorá testuje či je prvok v zozname prítomný len raz a do výsledku potom zaraďujeme len také.
Túto funkciu potom možno použiť vo funkcií vylúč(zoznam1,zoznam2) ktorá vylúči zo zoznamu1 všetky prvky ktoré sú v zozname2 viac ako 2x. V hlavnej funkcií potom výsledok dostaneme zavolaním funkcie vylúč s parametrami vylúč(zoznam, zoznam).


; Vráti T, ak sa prvok nachádza menej ako 2x.
; Použitie pomocného parametra c, v ktorom počítam výskyt prvku,
; zefektívňuje funkciu, pretože ak je prvok v zozname 2x, už nehľadám ďalej.
; C sa má inicializovať na 0.
(defun less2 (sv c zoz)
 (cond ((= c 2) NIL)
       ((null zoz) T)
       ((equal sv (first zoz)) (less2 sv (+ c 1) (rest zoz)))
       (T (less2 sv c (rest zoz)))
 )
)

; Funkcia vylúč vylúči zo zoz1 všetky prvku, ktoré sa
; v zoz2 nachádzajú viac ako raz. 
(defun vyluc (zoz1 zoz2) 
 (cond ((null zoz1) NIL)
       ((less2 (first zoz1) 0 zoz2) (cons (first zoz1) (vyluc (rest zoz1) zoz2)))
       (T (vyluc (rest zoz1) zoz2))
 )
)

; Hlavná funkcia v ktorej realizujeme riešenie nášho problému.
(defun unique (zoz)
 (vyluc zoz zoz)
)

; Príklady:
(unique '(1 2 3 (2) 1 3 7 7)) ; -> (2 (2))
(unique '(1 a 2 b 3 a b a a)) ; -> (1 2 3)

 


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