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

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

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

Здравствуйте! Мне нужно для каждого элемента списка определить число повторений и представить результат в виде: ((элемент число_повторений) (элемент число_повторений) (элемент число_повторений) ...). Вот что у меня получилось:
Листинг программы
  1. (defun counter (a L)
  2. (cond
  3. ((null L) 0)
  4. ((equal a (car L)) (+ 1 (counter a (cdr L))))
  5. (t (counter a (cdr L)))))
  6. (defun f(lst)
  7. (cond ((null lst) nil)
  8. (t (list (car lst) (counter (car lst) lst) (f (remove (car lst) lst))))
  9. )
  10. )
  11. (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
Листинг программы
  1. (defun cnt (lst &optional acc)
  2.   (cond
  3.     ((null lst) acc)
  4.     (T (cnt (cdr lst)
  5.             ((lambda (a)
  6.                 (if a
  7.                    (subst (cons (car a) (1+ (cdr a))) a acc)
  8.                    (cons (cons (car lst) 1) acc)))
  9.                 (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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы