Повторяющиеся атомы в списке - Lisp

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

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

Определите функцию, зависящую от двух аргументов u и n, которая по данному списку строит список его элементов, встречающихся в нем не менее n раз. Решение: (может алгоритм и не правильный, но по другому не знаю как) 1. Строим список уникальных элементов.
;;строит из списка 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))
2. Посчитать сколько раз дубликаты входят в список
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}>.
Ошибка в функции g Как правильно сделать? Заранее спасибо.

Решение задачи: «Повторяющиеся атомы в списке»

textual
Листинг программы
(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), в котором удалены повторяющиеся элементы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.077 из 5
Похожие ответы