Определить число повторений каждого элемента списка - Lisp

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Мне нужно для каждого элемента списка определить число повторений и представить результат в виде: ((элемент число_повторений) (элемент число_повторений) (элемент число_повторений) ...). Вот что у меня получилось:
(defun counter (a L)
  (cond
   ((null L) 0)
   ((equal a (car L)) (+ 1 (counter a (cdr L))))
   (t (counter a (cdr L)))))
 
(defun f(lst)
    (cond ((null lst) nil)
          (t (list (car lst) (counter (car lst) lst) (f (remove (car lst) lst))))
    )
)
 
(f '(1 2 3 4 4 4 1 2 1))
Но для (f '(1 2 3 4 4 4 1 2 1)) получается (1 3 (2 2 (3 1 (4 3 NIL)))). Подскажите, в чем проблема?

Решение задачи: «Определить число повторений каждого элемента списка»

textual
Листинг программы
(defun cnt (lst &optional acc)
  (cond
    ((null lst) acc)
    (T (cnt (cdr lst)
            ((lambda (a)
                (if a 
                   (subst (cons (car a) (1+ (cdr a))) a acc)
                   (cons (cons (car lst) 1) acc)))
                (assoc (car lst) acc))))))

Объяснение кода листинга программы

В данном коде определен анонимный функтор (lambda), который принимает в качестве аргумента a некоторый элемент списка lst и текущее значение счетчика повторений этого элемента acc. Если элемент встречается в списке не впервые (т.е. a не равно nil), то он заменяет текущее значение acc на новое значение, равное сумме (1+ (cdr a)) (т.е. увеличивается на единицу), а также добавляет в начало нового значения (cons (car a) (1+ (cdr a))) элемент списка, с которым встретился (car lst). Если элемент встречается впервые, то просто добавляется в начало значения acc, которое затем будет использоваться для подсчета повторений. (defun cnt (lst &optional acc) (cond ((null lst) acc) (T (cnt (cdr lst) ((lambda (a) (if a (subst (cons (car a) (1+ (cdr a))) a acc) (cons (cons (car lst) 1) acc))) (assoc (car lst) acc))))))

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4 из 5
Похожие ответы