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

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

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

Условие задачи: найти в списке элементы с одинаковым значением но с противоположным знаком и удалить первый из них. Пример: ( 3 4 5 -3 ) --> ( 4 5 -3).
(defun S(a)
 (cond
  ((null a) nil)
  ( T (CONS (CAR a) (S (D (CAR a) (CDR a)))) )
 )
)

(defun D(a l)
 (cond
  ((null l) nil)
 
  ((ZEROP (+ a (CAR l))) (D a (CDR l)) )
  (T (CONS (CAR l) (D a (CDR l))) )
 )
)
При данном коде всё работает наоборот. Удаляет второй элемент. ( 3 4 5 -3 ) --> (3 4 5)

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

textual
Листинг программы
(defun del-a (lst &optional (z nil) (r nil))
  (cond ((null lst) r)
        ((member (abs (car lst)) z) (del-a (cdr lst) z r))
        (t (del-a (cdr lst) (cons (abs (car lst)) z) (cons (car lst) r))))) 
        
==> del-a
 
(defun task (lst)
   (del-a (reverse lst)))
 
==> task
 
(task '(1 2 3 4 5 -5 -4 -3 -2 -1))
 
==> (-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