Ошибка в решении задачи - 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)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д