Разобраться в ошибке - 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
дляcdr
d
иx
. cdr
d
равенnil
, поэтому возвращаетсяd
иnil
.- Третий элемент
L
не является списком, поэтому вызывается функцияdeletx
дляcdr
nil
иx
. cdr
nil
равенnil
, поэтому возвращаетсяnil
иnil
.- Третий элемент
L
не является списком, поэтому вызывается функцияdeletx
дляcdr
nil
иx
. cdr
nil
равенnil
, поэтому возвращаетсяnil
иnil
.- Третий элемент
L
не является списком, поэтому вызывается функцияdeletx
дляcdr
nil
иx
. cdr
nil
равенnil
, поэтому возвращаетсяnil
иnil
. Таким образом, результат вызова(deletx '(a b c (b c d)) 'b)
будет(a b (b d))
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д