Список: расположить вначале неотрицательные элементы, затем отрицательные - Lisp

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

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

Преобразовать исходный список, расположив вначале неотриц. элементы, затем отрицат. Порядок неотриц. элементов изменить на обратный, а порядок отриц. элементов оставить прежним. Пример: ( -1 0 3 -2 4) Получим ( 4 3 0 -1 -2) LISP

Решение задачи: «Список: расположить вначале неотрицательные элементы, затем отрицательные»

textual
Листинг программы
(defn append (l1 l2) (cond (null? l1) l2 (cons (car l1) (append (cdr l1) l2))))
 
(defn foldl (f a l)
    (cond (null? l) a
          (foldl f (f (car l) a) (cdr l)) ))
 
(defn reverse (l) (foldl cons nil l))
 
(defn filter (f l)
    (defn go (a l)
        (cond (null? l) a
              (f (car l)) (cons (car l) (go a (cdr l)))
              (go a (cdr l))))
    (go nil l))
 
(defn task (l) append (reverse (filter (lambda (x) <= 0 x) l)) (filter (lambda (x) > 0 x) l))

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

В коде четыре функции:

  1. Приложение двух списков:
    • «append» — принимает два списка в качестве аргументов.
    • «l1» и «l2» — первый и второй списки соответственно.
    • «cond» — проверка условия: если первый список равен «nil», то возвращает второй список.
    • «cons» — создание нового элемента списка.
    • «car» — возвращает первый элемент списка.
    • «cdr» — возвращает список, начиная с первого элемента, кроме первого элемента.
  2. Функция «foldl»:
    • «foldl» — принимает три аргумента: функцию, начальное значение и список.
    • «f» — функция, которая будет применяться к каждому элементу списка.
    • «a» — начальное значение функции.
    • «l» — список, который необходимо обработать.
    • «cond» — проверка условия: если список равен «nil», то возвращает начальное значение функции.
    • «foldl» — рекурсивный вызов функции «foldl».
    • «cons» — создание нового элемента списка.
    • «nil» — завершающий элемент списка.
  3. Обратное преобразование списка:
    • «reverse» — принимает список в качестве аргумента.
    • «foldl» — рекурсивный вызов функции «foldl».
    • «cons» — создание нового элемента списка.
    • «nil» — завершающий элемент списка.
  4. Фильтрация элементов списка:
    • «filter» — принимает три аргумента: функцию, начальное значение и список.
    • «f» — функция, которая будет применяться к каждому элементу списка.
    • «l» — список, который необходимо обработать.
    • «go» — вспомогательная функция, которая принимает два аргумента: первый элемент списка и список остальных элементов.
    • «cond» — проверка условия: если список равен «nil», то возвращает список элементов, для которых выполняется условие.
    • «f» — рекурсивный вызов вспомогательной функции «go».
    • «go» — рекурсивный вызов вспомогательной функции «go».
  5. Основная функция:
    • «task» — принимает список в качестве аргумента.
    • «append» — рекурсивный вызов функции «append».
    • «reverse» — рекурсивный вызов функции «reverse».
    • «filter» — рекурсивный вызов функции «filter».
    • «lambda» — создаёт анонимную функцию.
    • «<= 0» — условие для фильтрации элементов списка.
    • «> 0» — условие для фильтрации элементов списка.

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


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

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

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