Написать функцию со списками - 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.