Удалить элементы списка вне диапазона - 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).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д