1- 4_Функциональное программирование_4
.docФункциональное программирование.
Контрольная работа № 1.
№ варианта: 4
Задание №1. Напишите функцию, осуществляющую циклическую перестановку элементов в списке, т.е. (f g h j) -> (g h j f).
Решение: Так как сказано, что рекурсия в первой задаче не требуется, то функцию перестановка будет выполнятся один раз за один вызов функции, т.к. неизвестно, сколько элементов будет в списке.
Функция APPEND используется вместо CONS потому что APPEND сливает списки вместе как один список, а CONS возвращает список только из двух элементов – головы и хвоста.
Функция LIST используется из-за того, что функция FIRST при слитии списка (APPEND) возвращает значение в виде точки и элемента – откуда берется эта точка я так и не понял. Поэтому функцию LIST я использую для того, чтобы убрать эту точку.
Текст программы:
(defun g (s)
(append (rest s) (list (first s))) ;Перестановка
)
Задание №2. Напишите функцию, которая из данного списка строит список списков его элементов, например, (a b) -> ((a) (b)).
Решение:
(defun list1 (s)
(if (null s) nil ;проверка наличия элементов в списке
;построение списка списков его элементов
(cons (list (first s)) (list1 (rest s)))
)
)
Задание №3. Определите функцию, зависящую от двух аргументов u и v, являющихся списками, которая вычисляет список всех элементов u, не содержащихся в v.
Решение:
(defun iskl (u v)
(cond ((null u) nil) ;проверка наличия элементов в списке
;проверка наличия первого элемента списка u в списке v
;если элемент найден, то проверяется следующий элемент
((member (first u) v) (iskl (rest u) v))
;первый элемент списка u в списке v не найден
;поэтому «заносим» его в список, возвращаемый функцией
(t (cons (first u) (iskl (rest u) v)))
)
)