Удалить из числового списка числа, нарушающие возрастающий порядок - Lisp
Формулировка задачи:
(defun del-b (lst) (cond ((null (cdr lst)) lst) ((>= (cadr lst) (car lst)) (cons (car lst) (del-b (cdr lst)))) (t (del-b (cons (car lst) (cddr lst)))))) ==> del-b (del-b '(1 2 3 4)) ==> (1 2 3 4) (del-b '(1 2 3 1 4)) ==> (1 2 3 4) (del-b '(1 2 3 1)) ==> (1 2 3)
Решение задачи: «Удалить из числового списка числа, нарушающие возрастающий порядок»
(defun cons-b (xs y) (if (>= y (car xs)) (cons y xs) xs)) (defun rem-b (xs) (unless (null xs) (nreverse (reduce #'cons-b (cdr xs) :initial-value (list (car xs)))))) (rem-b '(1 2 3 4)) ; (1 2 3 4) (rem-b '(1 2 3 1 4)) ; (1 2 3 4) (rem-b '(1 2 3 1)) ; (1 2 3)
Объяснение кода листинга программы
В коде представлены две функции: cons-b
и rem-b
.
Функция cons-b
принимает два аргумента: xs
и y
. Если y
больше или равно значению первого элемента в списке xs
, то возвращается новый список, в противном случае возвращается исходный список xs
.
Функция rem-b
принимает один аргумент: xs
. Если xs
не является nil
, то возвращается новый список, полученный с помощью функции nreverse
, которая инвертирует порядок элементов в списке. Для получения нового списка используется функция reduce
, которая применяет функцию cons-b
к каждому элементу списка xs
, начиная с cdr
и заканчивая car
. При первом вызове cons-b
передаётся начальное значение — первый элемент в списке xs
.
Примеры использования функции rem-b
показывают, что она удаляет повторяющиеся элементы из списка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д