Повторяющиеся атомы в списке - 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)
, в котором удалены повторяющиеся элементы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д