Разобраться в ошибке - Lisp (229482)
Формулировка задачи:
Задача:Определить функцию ,которая удаляет из списка произвольной структуры по одному элементу,следующему за заданным атамом Х.(реализовать надо рекурсивно,желательно использовать cond)
Ошибка происходит когда появляется подсписок,с линейным списком работает верно.
скорее всего в этой строке ошибка,но я не могу понять какая.
(defun deletx ( L x)
(cond ((null L) nil)
((listp (car L)) (cons (deletx(caar l)) (deletx (cdr l))))
((neq x (car L)) (cons (car L) (deletx (cdr L) x)))
((= x (car L)) (cons x (deletx (cddr l) x)))
(t(deletx (cdr L) x ))))((listp (car L)) (cons (deletx(caar l)) (deletx (cdr l))))
Решение задачи: «Разобраться в ошибке»
textual
Листинг программы
(defun deletx ( L x) (cond ((null L) nil) ((listp (car L)) (cons (deletx (car l) x) (deletx (cdr l) x))) ((neq x (car L)) (cons (car L) (deletx (cdr L) x))) ((eq x (car L)) (cons x (deletx (cddr l) x))) (t(deletx (cdr L) x )))) ==> deletx (deletx '(a b c (b c d)) 'b) ==> (a b (b d))
Объяснение кода листинга программы
В данном коде представлена функция deletx, которая принимает два аргумента: L и x.
Если L равно nil, то возвращается nil.
Если L является списком, то возвращается новый список, полученный путем вызова функции deletx для первого элемента L и x, а затем для второго элемента L и x.
Если x не равно первому элементу L, то возвращается новый список, состоящий из первого элемента L и x.
Если x равно первому элементу L, то возвращается новый список, состоящий из x и второго элемента L.
Если L не является списком, то вызывается функция deletx для cdr L и x.
Применяя эту логику к примеру использования (deletx '(a b c (b c d)) 'b), мы получаем следующий результат:
Lравно(a b c (b c d)).- Первый элемент
Lравенa. - Второй элемент
Lравенb. - Третий элемент
Lравен(b c d). xравно'b'.- Первый элемент
Lне равенx, поэтому возвращаетсяaиx. - Второй элемент
Lравенx, поэтому возврашаетсяbи(b c d). - Третий элемент
Lне является списком, поэтому вызывается функцияdeletxдляcdr(b c d)иx. cdr(b c d)равен(c d).xравно'b', поэтому возвращаетсяbи(c d).- Третий элемент
Lне является списком, поэтому вызывается функцияdeletxдляcdr(c d)иx. cdr(c d)равенd.xравно'b', поэтому возвращаетсяbиd.- Третий элемент
Lне является списком, поэтому вызывается функцияdeletxдляcdrdиx. cdrdравенnil, поэтому возвращаетсяdиnil.- Третий элемент
Lне является списком, поэтому вызывается функцияdeletxдляcdrnilиx. cdrnilравенnil, поэтому возвращаетсяnilиnil.- Третий элемент
Lне является списком, поэтому вызывается функцияdeletxдляcdrnilиx. cdrnilравенnil, поэтому возвращаетсяnilиnil.- Третий элемент
Lне является списком, поэтому вызывается функцияdeletxдляcdrnilиx. cdrnilравенnil, поэтому возвращаетсяnilиnil. Таким образом, результат вызова(deletx '(a b c (b c d)) 'b)будет(a b (b d)).