Написать функцию со списками - Lisp
Формулировка задачи:
Привет всем!
Нахлынула недавно задача:
Вообще не понимаю, что надо сделать. Это как-то связано в дискретной математикой? Предикаты ...
Напишите функцию (range S М N P), которая выдает список элементов списка S, удовлетворяющих некоторому предикату P и расположенных между М-ным и N-ным элементами включительно.
Решение задачи: «Написать функцию со списками»
textual
Листинг программы
(defun conditional-range (w n m p &aux (a (car w)) (d (cdr w))) (cond ((null w) nil) ((zerop m) (when (funcall p a) (list a))) ((and (<= n 0) (funcall p a)) (cons a (conditional-range d 0 (1- m) p))) ((conditional-range d (1- n) (1- m) p)))) > (conditional-range '(1 2 3 4 5 6 7 12 33 45 57) 12 57 'oddp) NIL > (conditional-range '(1 2 3 11 22 33 44 66 88) 4 7 #'evenp) (22 44 66) > (conditional-range '(1 2 3 11 22 33 44 66 88) 4 7 #'oddp) (33) > (conditional-range '() 12 57 'oddp) NIL
Объяснение кода листинга программы
В этом коде определена функция conditional-range
. Она принимает четыре аргумента: w
, n
, m
и p
. Аргумент w
— это список чисел, аргументы n
и m
— это числа, а аргумент p
— это функция, которая принимает одно число и возвращает nil
или t
, в зависимости от того, является ли число четным или нечетным.
Функция conditional-range
работает следующим образом:
- Если
w
— это пустой список, функция возвращаетnil
. - Если
m
равно нулю, и функцияp
возвращаетt
для первого элементаw
, то функция возвращает список, содержащий только первый элементw
. - Если
n
меньше или равно нулю и функцияp
возвращаетt
для первого элементаw
, то функция возвращает список, содержащий первый элементw
, и рекурсивно вызывает себя для оставшейся части спискаd
, с аргументамиn
равным0
,m
равным1-m
, иp
без изменений. - Если
n
больше нуля и функцияp
возвращаетt
для первого элементаw
, то функция возвращает пустой список. Примеры использования функцииconditional-range
: — В первом примере функция вызывается с аргументами'(1 2 3 4 5 6 7 12 33 45 57)'
,12
,57
и#'oddp'
. Поскольку список содержит 12 элементов, и все они нечетные, функция возвращает список, содержащий все элементы. — Во втором примере функция вызывается с аргументами'(1 2 3 11 22 33 44 66 88)'
,4
и7
и#'evenp'
. Поскольку функцияp
возвращаетnil
для всех нечетных чисел, функция возвращает список, содержащий только четные числа22
,44
и66
. — В третьем примере функция вызывается с теми же аргументами, что и во втором примере, но с функциейp
, которая возвращаетt
для нечетных чисел. В результате функция возвращает список, содержащий только нечетное число33
. — В четвертом примере функция вызывается с аргументомw
, который является пустым списком. Поскольку условие в первом пункте истинно, функция возвращаетnil
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д