Работа со списками.Задача решена, но не работает в некоторых случиях - Lisp
Формулировка задачи:
Ниже код, все верно кроме функции unique, она не работает если вводить по несколько раз одну и ту же букву в одном списке. и в конечном итоге если ее нет во втором то он ее выведет несколько раз, так не надо. не могу разобраться как сделать(Есть скрин) Если можно с объяснением пожалуйста
Задача: Определите функцию, зависящую от двух аргументов u и v, являющихся списками, которая вычисляет список всех элементов, содержащихся либо в u, либо в v, но не одновременно в u и v.
Ответ: (exclusive '(a b c) '(c d))
(a b d)
Листинг программы
- (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)))))
Решение задачи: «Работа со списками.Задача решена, но не работает в некоторых случиях»
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))))))
Объяснение кода листинга программы
В данном коде определен функционал для работы со списками, а именно удаление элемента из списка. Давайте разберем его поэлементно:
- (DEFUN REMOVE (X L) ...) - определяет функцию с именем REMOVE, которая принимает два аргумента типа FIXNUM - X и L.
- (COND ((NULL L) NIL) ...) - используется для проверки условия, когда список L равен NULL (т.е. пустой). Если это условие истинно, то возвращается NIL.
- ((EQUAL X (CAR L)) (REMOVE X (CDR L))) - используется для проверки условия, когда первый элемент списка L равен X. Если это условие истинно, то функция REMOVE вызывается рекурсивно для списка (CDR L) с аргументом X.
- (T (CONS (CAR L) (REMOVE X (CDR L)))) - используется для проверки условия, когда первый элемент списка L не равен X. В этом случае создается новый список, состоящий из первого элемента списка L и рекурсивно вызывается функция REMOVE для списка (CDR L) с аргументом X. Таким образом, данный код позволяет удалить элемент X из списка L. Однако, возможно, он не будет работать корректно, если список L будет содержать только один элемент или будет пустым.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д