Требуется реализация задачи на Lisp

Узнай цену своей работы

Формулировка задачи:

Напишите функцию (drop L N P), которая удаляет N элементов с конца списка L, удовлетворяющих некоторому предикату P.

Решение задачи: «Требуется реализация задачи на Lisp»

textual
Листинг программы
(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 для четных чисел.

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

9   голосов , оценка 3.667 из 5