Удаление всех положительных чисел из многоуровневого списка - 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
. Анонимная функция проверяет, является ли элемент числом и больше нуля.
Оба представленных кода выполняют одну и ту же задачу — удаление всех положительных чисел из многоуровневого списка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д