Удалить элементы списка вне диапазона - Lisp
Формулировка задачи:
Диапазон задан не порядком элементов (от 4 до 10, например), а минимальным и максимальным значением.
Нашёл здесь нечто похожее, но после моей "переделки" - работает не корректно. выводится исходный список.
Буду рад помощи!
(defun myFilter (mn mx list) (if list (let ((head (car list)) (tail (cdr list))) (if (and (>= head mx)(<= head mn)) (myFilter mn mx tail) (cons head (myFilter mn mx tail))))))
Решение задачи: «Удалить элементы списка вне диапазона»
textual
Листинг программы
(defun range (n m w) (remove-if-not #'(lambda (a)(<= n a m)) w)) > (range 1 3 '(1 2 3 -4 7 2 11 5)) (1 2 3 2)
Объяснение кода листинга программы
В данном коде представлена функция с именем range
, которая принимает три аргумента: n, m, w.
- Аргумент n — это номер первого элемента в диапазоне, который должен быть удален.
- Аргумент m — это номер последнего элемента в диапазоне, который должен быть удален.
- Аргумент w — это список, из которого необходимо удалить элементы вне диапазона. Функция использует следующую логику:
- Создается новая функция
remove-if-not
с помощью которой будет происходить удаление элементов из спискаw
. - Внутри функции
remove-if-not
используется лямбда-функция, которая проверяет условие:a
(текущий элемент списка) должен быть больше или равен аргументуn
и меньше аргументаm
. - Если условие выполняется, то элемент
a
удаляется из спискаw
. - Результатом работы функции
range
будет списокw
без элементов вне диапазона. В данном примере функцияrange
вызывается с аргументами: n=1, m=3, w='(1 2 3 -4 7 2 11 5). После удаления элементов вне диапазона, результатом будет список (1 2 3 2).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д