Требуется реализация задачи на Lisp
Формулировка задачи:
Решение задачи: «Требуется реализация задачи на Lisp»
(defun task (lst p n &optional (r nil)) (cond ((null lst) r) ((zerop n) (append lst r)) ((funcall p (car (last lst))) (task (butlast lst) p (- n 1) r)) (t (task (butlast lst) p n (append (last lst) r))))) ==> task (task '(1 2 3 4 5 6 7 8) #'evenp 2) ==> (1 2 3 4 5 7
Объяснение кода листинга программы
Код представляет собой реализацию рекурсивной функции task, которая принимает список lst и номер элемента n в этом списке, а также опциональный результат предыдущего вычисления r. Если n равно нулю, то результат — это r. Если n равно нулю и функция p возвращает nil, то результат — это append списков lst и r. Если n равно нулю и функция p возвращает не nil, то результат — это рекурсивный вызов функции task с аргументами (butlast lst), p, (- n 1) и append (last lst) r). Если n не равно нулю, то результат — это рекурсивный вызов функции task с аргументами (butlast lst), p, n и (append (last lst) r)).
В данном случае, функция task будет применяться к списку [1, 2, 3, 4, 5, 7], с номером 2 и функцией #'evenp в качестве аргументов. Функция evenp возвращает nil для нечетных чисел, и поэтому первый рекурсивный вызов будет иметь аргументы [1, 2, 3, 4, 5], 2, nil и []. Второй рекурсивный вызов будет иметь аргументы [1, 2, 3, 4, 5], 1, nil и [2], и вернет [2], который будет объединен с [], чтобы получить итоговый результат [2], так как функция p возвращает nil для четных чисел.