Повторяющиеся атомы в списке - Lisp
Формулировка задачи:
;;строит из списка list список его уникальных элементов
(defun rem--dup (list acc)
(if list
(if (member (car list) acc)
(rem--dup (cdr list) acc)
(rem--dup (cdr list) (cons (car list) acc)))
acc))
;;вызывает rem--dup
(defun rm-dupl (list)
(rem--dup list nil))CL-USER> (defun g(x)
(setq y (rm-dupl x))
(cond
((eq (car y)(car x))(1+ (g (cdr x))))
(t (g (cdr x)))
))
; in: DEFUN G
; (SETQ Y (RM-DUPL X))
;
; caught WARNING:
; undefined variable: Y
;
; compilation unit finished
; Undefined variable:
; Y
; caught 1 WARNING condition
G
CL-USER> (g '(f d t r y f))
Control stack guard page temporarily disabled: proceed with caution
; Evaluation aborted on #<SB-KERNEL::CONTROL-STACK-EXHAUSTED {10057834C3}>.Решение задачи: «Повторяющиеся атомы в списке»
(defun drop<n (n w) (remove-duplicates (remove-if #'(lambda (a) (< (count a w) n)) w))) > (drop<n 2 '(40 2 8 9 4 2 8 9 4 1 4 1 2 8 7 9 7)) (4 1 2 8 9 7)
Объяснение кода листинга программы
В коде определена функция drop<n с двумя аргументами: n и w.
Функция remove-duplicates удаляет дубликаты из списка, а функция remove-if удаляет элементы из списка, которые удовлетворяют заданному условию.
В данном случае условие задано с помощью анонимной функции #'(lambda (a) (< (count a w) n)). В этой анонимной функции происходит сравнение количества повторений элемента a в списке w с переменной n. Если количество повторений меньше n, то элемент a удаляется из списка.
Таким образом, функция drop<n принимает список w и количество повторений n и возвращает список без повторяющихся элементов.
При вызове функции (drop<n 2 '(40 2 8 9 4 2 8 9 4 1 4 1 2 8 7 9 7)) передается значение n=2 и список w='(40 2 8 9 4 2 8 9 4 1 4 1 2 8 7 9 7).
В результате выполнения функции получаем список (4 1 2 8 9 7), в котором удалены повторяющиеся элементы.