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