Ошибка в решении задачи - Lisp
Формулировка задачи:
(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))) ) ) )
Решение задачи: «Ошибка в решении задачи»
(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).