Написать функцию со списками - Lisp

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

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

Привет всем! Нахлынула недавно задача:
Напишите функцию (range S М N P), которая выдает список элементов списка S, удовлетворяющих некоторому предикату P и расположенных между М-ным и N-ным элементами включительно.
Вообще не понимаю, что надо сделать. Это как-то связано в дискретной математикой? Предикаты ...

Решение задачи: «Написать функцию со списками»

textual
Листинг программы
  1. (defun conditional-range (w n m p &aux (a (car w)) (d (cdr w)))
  2.   (cond ((null w) nil)
  3.         ((zerop m) (when (funcall p a) (list a)))
  4.         ((and (<= n 0) (funcall p a))
  5.          (cons a (conditional-range d 0 (1- m) p)))
  6.         ((conditional-range d (1- n) (1- m) p))))
  7.  
  8. > (conditional-range '(1 2 3 4 5 6 7 12 33 45 57) 12 57 'oddp)
  9. NIL
  10. > (conditional-range '(1 2 3 11 22 33 44 66 88) 4 7 #'evenp)
  11. (22 44 66)
  12. > (conditional-range '(1 2 3 11 22 33 44 66 88) 4 7 #'oddp)
  13. (33)
  14. > (conditional-range '() 12 57 'oddp)
  15. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы