Pri implementácií si treba uvedomiť, že prázdny zoznam NIL nepočítame ako atóm.
Pre zjednodušenie použijeme viacero funkcií.

Možným riešením je, že hlavná funkcia (POCITAJ-ATOMY) zavolá funkciu, ktorá vykoná požadovanú úlohu pre prvky vľavo (vlavo) a funkciu, ktorá ju vykoná pre prvky vpravo od význačného prvku (vpravo).

Funkcia vlavo zistí počet prvkov vľavo od význačného na hornej úrovni v zozname a rekurzívne to isté pre všetky podzoznamy tohto zoznamu. Ak na danej úrovni nie je význačný prvok vracia, pre danú úroveň 0.
Pri tejto funkcii je výhodné použiť pomocný argument. Pretože ak pri hľadaní na danej úrovni nenájdeme význačný prvok, narazíme teda na koniec zoznamu, máme možnosť vrátiť počet=0.

Podobne funkcia vpravo zistí počet prvkov vpravo od význačného na hornej úrovni v zozname a rekurzívne to isté pre všetky podzoznamy tohto zoznamu. Ak na danej úrovni nie je význačný prvok vracia, pre danú úroveň 0.
Funkcia na danej úrovni vždy hľadá význačný prvok, a ak ho nájde spočíta atómy na danej úrovni za ním. Pričom, ale pokračuje v ďalšom hľadaní pre podzoznamy na danej úrovni.


; Na počítanie prvkov môžeme použiť funkciu sucet.
; Počíta len atómy (NIL nie).
; (sucet '(1 () x a)) -> 3

(defun sucet (zoz)
 (cond ((NULL zoz) 0)
       ((NULL (first zoz)) (sucet (rest zoz)))
       ((ATOM (first zoz)) (+ 1 (sucet (rest zoz))))
       (T (sucet (rest zoz)))
 )
)


; Ak prvok na danej úrovni nenájde vráti pre danú úroveň 0.
; Počíta len atómy (NIL nie).

(defun vlavo (zoz prv poc)
 (cond ((NULL zoz) 0)
       ((equal prv (first zoz)) (+ poc (vlavo (rest zoz) prv 0)))
       ((NULL (first zoz)) (vlavo (rest zoz) prv poc))
       ((ATOM (first zoz)) (vlavo (rest zoz) prv (+ poc 1)))
       (T (+ (vlavo (first zoz) prv 0) (vlavo (rest zoz) prv poc))))
 )
)

; Príklady:
(vlavo '((1 2 x 1)) 'x 0)       ; -> 2
(vlavo '(x (1 x)) 'x 0)         ; -> 1
(vlavo '(1 (2 3 x) x 4 5) 'x 0) ; -> 3


; Ak prvok na danej úrovni nenájde vráti pre danú úroveň 0.
; Počíta len atómy (NIL nie).

(defun vpravo (zoz prv)
 (cond ((ATOM zoz) 0)
       ((equal prv (first zoz)) (+ (sucet (rest zoz)) (vpravo (rest zoz) prv)))
       (T (+ (vpravo (first zoz) prv) (vpravo (rest zoz) prv)))
 )
)

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


; Hlavná funkcia.
(defun POCITAJ-ATOMY (sv prv)
 (list (vlavo sv prv 0) (vpravo sv prv))
)

; Príklady:
(POCITAJ-ATOMY '((1 x 1)(x (2 x 2 3))(4 5)) 'x) ; -> (2 3)
(POCITAJ-ATOMY '((x (x) 1 2)(3 4)) 'x)          ; -> (0 2)

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