Работа со списками.Задача решена, но не работает в некоторых случиях - Lisp

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

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

Ниже код, все верно кроме функции unique, она не работает если вводить по несколько раз одну и ту же букву в одном списке. и в конечном итоге если ее нет во втором то он ее выведет несколько раз, так не надо. не могу разобраться как сделать(Есть скрин) Если можно с объяснением пожалуйста Задача: Определите функцию, зависящую от двух аргументов u и v, являющихся списками, которая вычисляет список всех элементов, содержащихся либо в u, либо в v, но не одновременно в u и v.
(defun exclusive(w v)
  (comp (unique w v) (unique v w)))

(defun comp (x y)
       (cond ((null x) y)
             (t (cons (car x) (comp (cdr x) y)))))
 
(defun unique (w v)
  (cond ((null w) nil)
        ((member (car w) v) (unique (cdr w) v))
        ((cons (car w) (unique (cdr w) v)))))
Ответ: (exclusive '(a b c) '(c d)) (a b d)

Решение задачи: «Работа со списками.Задача решена, но не работает в некоторых случиях»

textual
Листинг программы
(DEFUN REMOVE (X L) 
     (COND ((NULL L) NIL) 
               ((EQUAL X (CAR L)) (REMOVE X (CDR L))) 
               (T (CONS (CAR L) (REMOVE X (CDR L))))))

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

В данном коде определен функционал для работы со списками, а именно удаление элемента из списка. Давайте разберем его поэлементно:

  1. (DEFUN REMOVE (X L) ...) - определяет функцию с именем REMOVE, которая принимает два аргумента типа FIXNUM - X и L.
  2. (COND ((NULL L) NIL) ...) - используется для проверки условия, когда список L равен NULL (т.е. пустой). Если это условие истинно, то возвращается NIL.
  3. ((EQUAL X (CAR L)) (REMOVE X (CDR L))) - используется для проверки условия, когда первый элемент списка L равен X. Если это условие истинно, то функция REMOVE вызывается рекурсивно для списка (CDR L) с аргументом X.
  4. (T (CONS (CAR L) (REMOVE X (CDR L)))) - используется для проверки условия, когда первый элемент списка L не равен X. В этом случае создается новый список, состоящий из первого элемента списка L и рекурсивно вызывается функция REMOVE для списка (CDR L) с аргументом X. Таким образом, данный код позволяет удалить элемент X из списка L. Однако, возможно, он не будет работать корректно, если список L будет содержать только один элемент или будет пустым.

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


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

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

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