Отбор элементов, удовлетворяющих предикату - Lisp
Формулировка задачи:
При необходимости можно использовать локальные или вспомогательные функции.
Напишите функцию (filter p x), которая создает список из элементов списка х, удовлетворяющим предикату р (р – функция или функциональное имя).
Решение задачи: «Отбор элементов, удовлетворяющих предикату»
textual
Листинг программы
(defun filter (p lst) (cond ((null lst) nil) ((funcall p (car lst)) (cons (car lst) (filter p (cdr lst)))) (t (filter p (cdr lst))))
Объяснение кода листинга программы
В данном коде реализована функция filter, которая выполняет отбор элементов в списке lst, удовлетворяющих предикату p.
Вложенный блок cond проверяет три условия:
- Если
lstравноnil, то возвращаетсяnil, так как отбор не возможен. - Если
funcall p (car lst)возвращает истину, то возвращается новый список, в котором первый элементcar lstсоединен с оставшимся спискомfilter p (cdr lst). - Если условие выше не выполняется, то возвращается результат
filter p (cdr lst). Таким образом, код реализует функцию, которая вызывает предикат для каждого элемента списка и возвращает новый список, содержащий только те элементы, для которых предикат вернул истину.