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