Написать функцию,которая сохраняет дубликаты эл-ов списка в список.Пример описан ниже - Lisp

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

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

Например, (f '(1 2 3 1 2 3 5)) , в результате должен получиться список (1 2 3). А то единственное,что нашел..так это как "убрать дубликаты эл-ов" ((
(defun x-doubles (w &optional ac) (cond ((null w) ac) ((atom w) (adjoin w ac)) ((x-doubles (car w) (x-doubles (cdr w) ac))))) > (x-doubles '(1 2 3 1 2 3 5)) (1 2 3 5)
Не могу разобраться с 2мя последними строками.
К примеру, (f '(6 1 2 7 1 2 5)) ->(1 2). Народ,выручите,пожалуйста.

Решение задачи: «Написать функцию,которая сохраняет дубликаты эл-ов списка в список.Пример описан ниже»

textual
Листинг программы
(defun collect-doubles (list &optional (func #'equal))
  (let ((table (make-hash-table :test func)))
    (loop for (a . b) on list if (find a b :test func)
       do (setf (gethash a table) t))
    (loop for e being the hash-keys in table collect e)))

Объяснение кода листинга программы

В данном коде реализована функция collect-doubles, которая сохраняет дубликаты элементов списка в новый список. Функция принимает два аргумента: список и анонимную функцию func. Если func не указана, то по умолчанию используется функция equal. Внутри функции создается хэш-таблица с помощью make-hash-table, где ключами являются элементы списка, а значением - t. Затем происходит два цикла. Первый цикл с помощью loop проходит по всем элементам списка. Если элемент a уже присутствует в хэш-таблице (т.е. (find a b :test func) возвращает не nil), то в хэш-таблицу для элемента a присваивается значение t. Второй цикл с помощью loop проходит по всем ключам хэш-таблицы и собирает их в новый список. Таким образом, функция collect-doubles возвращает список, содержащий только дубликаты элементов исходного списка.

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


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

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

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