Список: расположить вначале неотрицательные элементы, затем отрицательные - 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))
Объяснение кода листинга программы
В коде четыре функции:
- Приложение двух списков:
- «append» — принимает два списка в качестве аргументов.
- «l1» и «l2» — первый и второй списки соответственно.
- «cond» — проверка условия: если первый список равен «nil», то возвращает второй список.
- «cons» — создание нового элемента списка.
- «car» — возвращает первый элемент списка.
- «cdr» — возвращает список, начиная с первого элемента, кроме первого элемента.
- Функция «foldl»:
- «foldl» — принимает три аргумента: функцию, начальное значение и список.
- «f» — функция, которая будет применяться к каждому элементу списка.
- «a» — начальное значение функции.
- «l» — список, который необходимо обработать.
- «cond» — проверка условия: если список равен «nil», то возвращает начальное значение функции.
- «foldl» — рекурсивный вызов функции «foldl».
- «cons» — создание нового элемента списка.
- «nil» — завершающий элемент списка.
- Обратное преобразование списка:
- «reverse» — принимает список в качестве аргумента.
- «foldl» — рекурсивный вызов функции «foldl».
- «cons» — создание нового элемента списка.
- «nil» — завершающий элемент списка.
- Фильтрация элементов списка:
- «filter» — принимает три аргумента: функцию, начальное значение и список.
- «f» — функция, которая будет применяться к каждому элементу списка.
- «l» — список, который необходимо обработать.
- «go» — вспомогательная функция, которая принимает два аргумента: первый элемент списка и список остальных элементов.
- «cond» — проверка условия: если список равен «nil», то возвращает список элементов, для которых выполняется условие.
- «f» — рекурсивный вызов вспомогательной функции «go».
- «go» — рекурсивный вызов вспомогательной функции «go».
- Основная функция:
- «task» — принимает список в качестве аргумента.
- «append» — рекурсивный вызов функции «append».
- «reverse» — рекурсивный вызов функции «reverse».
- «filter» — рекурсивный вызов функции «filter».
- «lambda» — создаёт анонимную функцию.
- «<= 0» — условие для фильтрации элементов списка.
- «> 0» — условие для фильтрации элементов списка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д