ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.01.2024
Просмотров: 28
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Министерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ
УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра автоматизированных систем управления (АСУ)
ЛОГИЧЕСКОЕ И ФУНКЦИОНАЛЬНОЕ
ПРОГРАММИРОВАНИЕ
Контрольная работа №1 вариант 6
Выполнил:
Студент ФДО ТУСУР
Гр. з-431П10-5
Специальности 09.03.01
Болотов А.Б.
Проверил:
________________________
________________________
Томск – 2023 г.
Оглавление
1.Тема 4
2.Задание 4
3.Решение 5
3.1.Задача 1 5
3.2.Задача 2 6
3.3.Задача 3 7
4.Список литературы 8
-
Тема
Задание состоит из трех задач, в которых требуется составить программы на Лиспе. В первой задаче не требуется рекурсия, остальные две задачи требуют применения простой рекурсии. При составлении программ (если не оговорено противное) можно использовать все встроенные функции Лиспа. Тексты всех программ, если вы мыслите в духе функционального программирования, буквально состоят из нескольких строчек.
Отладку программ можно осуществлять с помощью функции трассировки (trace <имя функции>), трассировка функции отключается - (untrace <имя функции>).
-
Задание
1. Определите функцию (f a b c), которая вычисляет список корней квадратного уравнения a*x^2+b*x+c=0 (если корней нет, то список пустой).
2. Напишите функцию, аналогичную встроенной функции замены subst в списке s выражения x на y, но производящую взаимную замену x на y, т.е.
x->y, y->x.
3. Определите функцию (f s), результатом которой является список, получающийся после удаления на всех уровнях всех положительных элементов списка чисел s.
-
Решение
-
Задача 1
(defun f (a b c)
(let ((discr (- (* b b) (* 4 a c)))) ;; вычисляем дискриминант
(cond ((< discr 0) '()) ;; если дискриминант отрицательный, возвращаем пустой список
((= discr 0) (list (/ (- b) (* 2 a)))) ;; если дискриминант равен нулю, возвращаем список с одним корнем
(t (list (/ (- b (sqrt discr)) (* 2 a)) (/ (- (- b) (sqrt discr)) (* 2 a))))))) ;; иначе возвращаем список с двумя корнями
-
Задача 2
Мы используем функцию mapcar для применения лямбда-функции к каждому элементу списка s. Лямбда-функция проверяет, равен ли текущий элемент x или y, и заменяет его соответствующим образом. Если элемент не равен ни x, ни y, он остается без изменений.
Таким образом, мы производим взаимную замену x на y и y на x в списке s.
(defun mutual-subst (s x y)
;; Применяем лямбда-функцию к каждому элементу списка s
(mapcar (lambda (elem)
;; Проверяем, равен ли текущий элемент x или y
(cond ((equal elem x) y) ;; Если равен x, заменяем на y
((equal elem y) x) ;; Если равен y, заменяем на x
(t elem))) ;; Иначе оставляем без изменений
s))
-
Задача 3
(defun f (s)
;; Применяем лямбда-функцию к каждому элементу списка s
(mapcar (lambda (elem)
;; Проверяем, является ли текущий элемент числом и больше ли оно нуля
(cond ((and (numberp elem) (> elem 0)) nil) ;; Если да, удаляем элемент
((listp elem) (f elem)) ;; Если список, рекурсивно вызываем f
(t elem))) ;; Иначе оставляем без изменений
s))
-
Список литературы
-
Хендерсон П. Функциональное программирование. Применение и реализация. - М.: Мир, 1983. - 349 с. -
Филд А., Харрисон П. Функциональное программирование. - М.: Мир, 1993. - 637 с. -
Шеховцов А. С. Квазисинхронное регулирование гистерезисных электродвигателей // Тез. докл. на науч.-техн. конф. 21-23 дек. 1998 г. - Т. 4 - Томск: -
Издательство Томского государственного педагогического университета, 1999. - 133 с. -
Калянов Г. Н. CASE-технологии проектирования программного обеспечения // Кибернетика и системный анализ. - 1993. - №5. - С. 152-164.