Ошибка в решении задачи - Lisp

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

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

Условие задачи: найти в списке элементы с одинаковым значением но с противоположным знаком и удалить первый из них. Пример: ( 3 4 5 -3 ) --> ( 4 5 -3).
Листинг программы
  1. (defun S(a)
  2. (cond
  3. ((null a) nil)
  4. ( T (CONS (CAR a) (S (D (CAR a) (CDR a)))) )
  5. )
  6. )
  7.  
  8. (defun D(a l)
  9. (cond
  10. ((null l) nil)
  11. ((ZEROP (+ a (CAR l))) (D a (CDR l)) )
  12. (T (CONS (CAR l) (D a (CDR l))) )
  13. )
  14. )
При данном коде всё работает наоборот. Удаляет второй элемент. ( 3 4 5 -3 ) --> (3 4 5)

Решение задачи: «Ошибка в решении задачи»

textual
Листинг программы
  1. (defun del-a (lst &optional (z nil) (r nil))
  2.   (cond ((null lst) r)
  3.         ((member (abs (car lst)) z) (del-a (cdr lst) z r))
  4.         (t (del-a (cdr lst) (cons (abs (car lst)) z) (cons (car lst) r)))))
  5.        
  6. ==> del-a
  7.  
  8. (defun task (lst)
  9.    (del-a (reverse lst)))
  10.  
  11. ==> task
  12.  
  13. (task '(1 2 3 4 5 -5 -4 -3 -2 -1))
  14.  
  15. ==> (-5 -4 -3 -2 -1)

Объяснение кода листинга программы

В коде определена функция del-a, которая принимает два аргумента: lst и два необязательных аргумента z и r. Если lst равно nil, то возвращается r. Если член с абсолютной величиной, равной car lst, присутствует в z, то рекурсивно вызывается del-a для cdr lst, z и r. Если удовлетворено предыдущее условие, то возвращается del-a, вызванный для cdr lst, cons (abs (car lst)) и cons (car lst) r. Также в коде определена функция task, которая принимает один аргумент lst и использует del-a для решения задачи, которую вы описали. Задача состоит в удалении всех отрицательных чисел из списка. В данном примере функция task применяется к списку (1 2 3 4 5 -5 -4 -3 -2 -1), и результат будет (5 4 3 2 1).

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


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

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

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

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

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

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