Удаление всех положительных чисел из многоуровневого списка - Lisp
Формулировка задачи:
Решение задачи: «Удаление всех положительных чисел из многоуровневого списка»
(defun task (lst) (cond ((null lst) nil) ((and (numberp (car lst)) (plusp (car lst))) (task (cdr lst))) ((listp (car lst)) (cons (task (car lst)) (task (cdr lst)))) (t (cons (car lst) (task (cdr lst)))))) ==> task (task '(1 2 0 -3 (((-7 8 -9))))) ==> (0 -3 (((-7 -9)))) (defun task (lst) (mapcar (lambda (x) (if (listp x) (task x) x)) (remove-if (lambda (y) (and (numberp y) (plusp y))) lst))) ==> task (task '(1 2 0 -3 (((-7 8 -9))))) ==> (0 -3 (((-7 -9))))
Объяснение кода листинга программы
В первом представленном коде функция task
принимает в качестве аргумента список lst
. В функции используется условная конструкция cond
, которая проверяет, является ли список пустым. Если это так, то возвращается nil
. Если первый элемент списка является числом и больше нуля, то функция вызывается рекурсивно для оставшейся части списка. Если первый элемент является списком, то функция вызывается рекурсивно для каждого элемента списка. В противном случае первый элемент списка добавляется в результат, а функция вызывается рекурсивно для оставшейся части списка.
Во втором представленном коде функция task
также принимает в качестве аргумента список lst
. Здесь используется функция mapcar
, которая применяет к каждому элементу списка анонимную функцию. Если элемент является списком, то функция task
вызывается рекурсивно для этого элемента. В противном случае элемент просто добавляется в результат. Затем используется функция remove-if
, которая удаляет из списка все элементы, для которых анонимная функция возвращает true
. Анонимная функция проверяет, является ли элемент числом и больше нуля.
Оба представленных кода выполняют одну и ту же задачу — удаление всех положительных чисел из многоуровневого списка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д