Jedna možnosť je, že
rozdelíme zoznam (napríklad podobne ako v
príklade porovnaj
) a
spočítame počet prvkov v častiach.
Jednoduchšie to však spravíme, keď rozdelenie zoznamu
skombinujeme priamo s počítaním.
Budeme prechádzať zoznamom a zároveň budeme počítať prvky až kým nenájdeme význačný prvok, potom spočítame prvky vo zvyšku zoznamu. Zistenie počtu prvkov vo zvyšku možno realizovať funkciou počet.
Na počítanie prvkov môžeme použiť funkciu počet.
(defun pocet (zoz)
(cond ((null zoz) 0)
(T (+ 1 (pocet (rest zoz))))
)
)
Na rozdelenie zoznamu a súčasné sčítanie.
Funkcia počíta prvky, nájde prvý výskyt atómu vp a sčíta zvyšok.
Pomocná premenná (suc) to zjednoduší
(pri použití sa má inicializovať na 0).
Ak nenájde vp vráti (počet 0).
; (1 2 vp 3) -> (2 1)
(defun rozdelasumpom (zoz vp suc)
(cond ((null zoz) (list suc 0))
((not (eq vp (first zoz))) (rozdelasumpom (rest zoz) vp (+ 1 suc)))
(T (list suc (pocet (rest zoz))))
)
)
(defun rozdelasum (zoz vp)
(rozdelasumpom zoz vp 0)
)
Príklady:
(rozdelasum '(1 2 3 x 4 c) 'x) -> (3 2)
(rozdelasum '(1 2 3) 'x) -> (3 0)
(rozdelasum '(1 x) 'x) -> (1 0)