Удалить элементы в списке - Lisp
Формулировка задачи:
Даны натуральные m, n, k, l и некоторый список. Удалить из списка элементы с номерами с m-го по n-й ,без удаления элементов с k-го по l-й. Интервал с k по l должен находит
ь
ся внутри интервала m по n. Не используя mapcar lambda apply Пример: (task '(1 2 3 4 5 6 7 8 9) m n k l) m=1 n=7 k=3 l=5 Ответ: (1 4 5 6 9)Решение задачи: «Удалить элементы в списке»
textual
Листинг программы
(defun task (lst m n k l) (cond ((null lst) nil) ((or (<= m 0 (1- k)) (<= (1+ l) 0 n)) (task (cdr lst) (1- m) (1- n) (1- k) (1- l))) (T (cons (car lst) (task (cdr lst) (1- m) (1- n) (1- k) (1- l))))))
Объяснение кода листинга программы
В данном коде определена функция с именем task
. Она принимает в качестве аргументов список (lst), а также 4 числа: m, n, k, l.
Если список пустой, то функция возвращает nil.
В противном случае, функция проверяет условие:
- Если m меньше или равно 0, и (1-k) меньше или равно 0, и (1-l) меньше или равно 0, и (1-n) меньше или равно 0, то рекурсивно вызывается функция task с аргументами (cdr lst), (1-m), (1-n), (1-k), (1-l). То есть, из списка удаляется первый элемент, и функция вызывается снова для оставшегося списка, при этом уменьшается значение каждого из чисел на 1.
- Если условие не выполняется, то функция возвращает список, в котором первым элементом является первый элемент списка (car lst), а остальные элементы списка удаляются.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д