Удалить из числового списка числа, нарушающие возрастающий порядок - Lisp

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

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

Задача из раздела "C++ для начинающих". Занятно сравнить длину кода (да и наглядность...). Мое решение:
(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)

Решение задачи: «Удалить из числового списка числа, нарушающие возрастающий порядок»

textual
Листинг программы
(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 показывают, что она удаляет повторяющиеся элементы из списка.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5
Похожие ответы