В список, упорядоченный по возрастанию, вставить новый элемент так, чтобы упорядоченность сохранилась - Lisp

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

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

Нужна помощь. В список, упорядоченный по возрастанию, вставить новый элемент так, чтобы упорядоченность сохранилась. Нужно реализовать код со спискоразрушающей функцией rplaca rplacd.

Решение задачи: «В список, упорядоченный по возрастанию, вставить новый элемент так, чтобы упорядоченность сохранилась»

textual
Листинг программы
(defun task (lst a &optional (start t) (prev lst) (curr (cdr lst)))
  (let ((u (list a)))
     (cond ((and start (<= a (car lst))) (cons a lst))
           ((null curr) (rplacd prev u) lst)
           ((<= a (car curr)) (rplacd u curr) (rplacd prev u) lst) 
           (t (task lst a nil (cdr prev) (cdr curr))))))   
 
==> TASK
 
(task '(1 3 5 7 9) 0)
 
==> (0 1 3 5 7 9)
 
(task '(1 3 5 7 9) 1)
 
==> (1 1 3 5 7 9)
 
(task '(1 3 5 7 9) 2)
 
==> (1 2 3 5 7 9)
 
(task '(1 3 5 7 9) 4)
 
==> (1 3 4 5 7 9)
 
(task '(1 3 5 7 9) 11)
 
==> (1 3 5 7 9 11)

Объяснение кода листинга программы

В данном коде представлена реализация функции task, которая выполняет вставку нового элемента в список, упорядоченный по возрастанию, таким образом, чтобы сохранить упорядоченность. Функция task принимает на вход следующие аргументы:

  1. lst — отсортированный список элементов, в который необходимо вставить новый элемент.
  2. a — новый элемент, который необходимо вставить в список.
  3. start — флаг, указывающий на то, что список пуст.
  4. prev — ссылка на предыдущий элемент в списке.
  5. curr — ссылка на текущий элемент в списке. Внутри функции происходит следующее:
  6. Создается новая переменная u, которая представляет собой список, содержащий элемент a.
  7. В зависимости от значения флага start и условий, связанных с текущим элементом списка, выполняется одно из следующих действий: — Если start равно t и текущий элемент списка равен a, то элемент a вставляется в начало списка. — Если start равно nil и текущий элемент списка пуст, то ссылка на предыдущий элемент списка заменяется на ссылку на элемент u. — Если текущий элемент списка не пуст и его первый элемент меньше a, то ссылка на предыдущий элемент списка заменяется на ссылку на элемент u, а ссылка на текущий элемент списка заменяется на новый список, содержащий элемент a. — Если текущий элемент списка не пуст и его первый элемент равен a, то ссылка на предыдущий элемент списка заменяется на ссылку на элемент u, а ссылка на текущий элемент списка заменяется на новый список, содержащий элемент a. — Если текущий элемент списка не пуст и его первый элемент больше a, то рекурсивно вызывается функция task для обработки следующего элемента списка.
  8. В конце функции возвращается значение lst. Пример использования функции task: (task '(1 3 5 7 9) 0) (task '(1 3 5 7 9) 1) (task '(1 3 5 7 9) 2) (task '(1 3 5 7 9) 4) (task '(1 3 5 7 9) 11)

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


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

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

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