Предикат, переставляющий отрицательные элементы в конец списка - Lisp

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

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

Добрый день! Нужна ваша помощь в решении задачи! Условие: предикат, переставляющий все отрицательные элементы числового списка в конец списка. Пример: [1,-2,3,-4,-7,4,5] => [1,3,4,5,-2,-4,-7]. Всем откликнувшимся огромное человеческое спасибо!

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

textual
Листинг программы
(defun F (l &optional s)
    (if l
        (if (zerop (car l)) 
            (F (cdr l) (push (car l) s))
            (cons (car l) (F (cdr l) s)))
        s))
 
(F '(0 1 0 0 2 3 0 4 5))
 
==> (1 2 3 4 5 0 0 0 0)

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

В коде определён вспомогательный функции с именем F. Если список l не равен nil, то выполняется следующая последовательность действий:

  1. Проверяется, является ли первый элемент списка l нулём.
  2. Если это так, то в стек s, который является вторым аргументом функции F, помещается первый элемент списка l.
  3. Затем рекурсивно вызывается функция F для списка, полученного из l путём удаления его первого элемента.
  4. В противном случае, то есть если первый элемент списка l не равен нулю, то из l создаётся новый список, в который включается его первый элемент.
  5. Затем рекурсивно вызывается функция F для списка, полученного из l путём удаления его первого элемента, и к полученному списку добавляется новый список, созданный на шаге 4.
  6. Если список l равен nil, то возвращается список s. В результате выполнения кода получается список (1 2 3 4 5 0 0 0 0), где все отрицательные элементы (0) находятся в конце списка.

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


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

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

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