Функционалы - 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:

  1. Если n отрицательно, то возвращается nil.
  2. Если x (список) пуст, то при n равном нулю возвращается t, в противном случае возвращается nil.
  3. Если значение функционала, применяемого к первому элементу списка x, истинно, то функция вызывается рекурсивно к оставшейся части списка, при этом значение n уменьшается на единицу.
  4. Если условие 3 не выполняется, то функция вызывается рекурсивно к оставшейся части списка без изменения значения n. В конце определения функционала f-n возвращается результат вызова функции на последнем элементе списка x и значение n.

Оцени полезность:

11   голосов , оценка 4.273 из 5