Написать функцию со списками - 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 работает следующим образом:

  1. Если w — это пустой список, функция возвращает nil.
  2. Если m равно нулю, и функция p возвращает t для первого элемента w, то функция возвращает список, содержащий только первый элемент w.
  3. Если n меньше или равно нулю и функция p возвращает t для первого элемента w, то функция возвращает список, содержащий первый элемент w, и рекурсивно вызывает себя для оставшейся части списка d, с аргументами n равным 0, m равным 1-m, и p без изменений.
  4. Если 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.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

6   голосов , оценка 4.333 из 5
Похожие ответы