Разобраться в ошибке - Lisp (229482)

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

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

Задача:Определить функцию ,которая удаляет из списка произвольной структуры по одному элементу,следующему за заданным атамом Х.(реализовать надо рекурсивно,желательно использовать cond)
Листинг программы
  1. (defun deletx ( L x)
  2. (cond ((null L) nil)
  3. ((listp (car L)) (cons (deletx(caar l)) (deletx (cdr l))))
  4. ((neq x (car L)) (cons (car L) (deletx (cdr L) x)))
  5. ((= x (car L)) (cons x (deletx (cddr l) x)))
  6. (t(deletx (cdr L) x ))))
Ошибка происходит когда появляется подсписок,с линейным списком работает верно.
Листинг программы
  1. ((listp (car L)) (cons (deletx(caar l)) (deletx (cdr l))))
скорее всего в этой строке ошибка,но я не могу понять какая.

Решение задачи: «Разобраться в ошибке»

textual
Листинг программы
  1. (defun deletx ( L x)
  2.     (cond ((null L) nil)
  3.            ((listp (car L)) (cons (deletx (car l) x) (deletx (cdr l) x)))
  4.            ((neq x (car L)) (cons (car L) (deletx (cdr L) x)))
  5.            ((eq x (car L)) (cons x (deletx (cddr l) x)))
  6.            (t(deletx (cdr L) x ))))
  7.  
  8. ==> deletx
  9.  
  10. (deletx '(a b c (b c d)) 'b)
  11.  
  12. ==> (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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут