Определить число повторений каждого элемента списка - 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))
Решение задачи: «Определить число повторений каждого элемента списка»
- (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))))))
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д