Author's photo
Anonymous author
informatika

Common Lisp

Potřeboval bych pomoc s níže uvedenou úlohou:

Napište funkci compress, která zkomprimuje vstupní seznam tak, že po sobě jdoucích n totožných hodnot (včetně n = 1) náhradním párem (a . n).

Příklad:

(comress '(a a a b b c d d d d))
((a . 3) ( b . 2) (c . 1) (d . 4))

Funkci napište pomocí obyčejné (nikoliv iterativní) rekurze bez použití vlastních pomocných funkcí a funkcí vyššího řádu.

1 answer
(defun compress (lst)
(if (null lst)
'()
(let ((current (car lst))
(rest (cdr lst)))
(let ((run-length (length (take-while (lambda (x) (equal x current)) lst))))
(cons (cons current run-length) (compress (nthcdr run-length lst)))))))