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

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

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

Определите функцию, зависящую от двух аргументов u и n, которая по данному списку строит список его элементов, встречающихся в нем не менее n раз. Решение: (может алгоритм и не правильный, но по другому не знаю как) 1. Строим список уникальных элементов.
Листинг программы
  1. ;;строит из списка list список его уникальных элементов
  2. (defun rem--dup (list acc)
  3. (if list
  4. (if (member (car list) acc)
  5. (rem--dup (cdr list) acc)
  6. (rem--dup (cdr list) (cons (car list) acc)))
  7. acc))
  8. ;;вызывает rem--dup
  9. (defun rm-dupl (list)
  10. (rem--dup list nil))
2. Посчитать сколько раз дубликаты входят в список
Листинг программы
  1. CL-USER> (defun g(x)
  2. (setq y (rm-dupl x))
  3. (cond
  4. ((eq (car y)(car x))(1+ (g (cdr x))))
  5. (t (g (cdr x)))
  6. ))
  7. ; in: DEFUN G
  8. ; (SETQ Y (RM-DUPL X))
  9. ;
  10. ; caught WARNING:
  11. ; undefined variable: Y
  12. ;
  13. ; compilation unit finished
  14. ; Undefined variable:
  15. ; Y
  16. ; caught 1 WARNING condition
  17. G
  18. CL-USER> (g '(f d t r y f))
  19. Control stack guard page temporarily disabled: proceed with caution
  20. ; Evaluation aborted on #<SB-KERNEL::CONTROL-STACK-EXHAUSTED {10057834C3}>.
Ошибка в функции g Как правильно сделать? Заранее спасибо.

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

textual
Листинг программы
  1. (defun drop<n (n w)
  2.   (remove-duplicates (remove-if #'(lambda (a) (< (count a w) n)) w)))
  3.  
  4. > (drop<n 2 '(40 2 8 9 4 2 8 9 4 1 4 1 2 8 7 9 7))
  5. (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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы