Разобраться в ошибке - 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), мы получаем следующий результат:

  1. L равно (a b c (b c d)).
  2. Первый элемент L равен a.
  3. Второй элемент L равен b.
  4. Третий элемент L равен (b c d).
  5. x равно 'b'.
  6. Первый элемент L не равен x, поэтому возвращается a и x.
  7. Второй элемент L равен x, поэтому возврашается b и (b c d).
  8. Третий элемент L не является списком, поэтому вызывается функция deletx для cdr (b c d) и x.
  9. cdr (b c d) равен (c d).
  10. x равно 'b', поэтому возвращается b и (c d).
  11. Третий элемент L не является списком, поэтому вызывается функция deletx для cdr (c d) и x.
  12. cdr (c d) равен d.
  13. x равно 'b', поэтому возвращается b и d.
  14. Третий элемент L не является списком, поэтому вызывается функция deletx для cdr d и x.
  15. cdr d равен nil, поэтому возвращается d и nil.
  16. Третий элемент L не является списком, поэтому вызывается функция deletx для cdr nil и x.
  17. cdr nil равен nil, поэтому возвращается nil и nil.
  18. Третий элемент L не является списком, поэтому вызывается функция deletx для cdr nil и x.
  19. cdr nil равен nil, поэтому возвращается nil и nil.
  20. Третий элемент L не является списком, поэтому вызывается функция deletx для cdr nil и x.
  21. cdr nil равен nil, поэтому возвращается nil и nil. Таким образом, результат вызова (deletx '(a b c (b c d)) 'b) будет (a b (b d)).

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


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

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

11   голосов , оценка 3.636 из 5