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