Используя рекурсивные вызовы пользовательских функций.
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
МОСКОВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ
(НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ)
____________________________________________
Факультет №3:
"Системы управления, информатика и электроэнергетика"
Кафедра 304: "Вычислительные машины, системы и сети"
Пояснительная записка
к курсовой работе
по дисциплине: "Функциональное и логическое программирование".
Вариант № 23
Доцент каф.304, к.т.н. Новиков П.В.
____________
Студент: Филимошин С.В.
группа: 03-219
____________
Москва, 2012
Тема №1: "Знакомство с префиксной нотацией и примитивами ЛИСПа"
1) Представить в старой и новой префиксной нотации заданное алгебраическое выражение:
Старая префиксная нотация:
(plus
(quotier
(times a b c)
(quotier m n k))
(quotier
(plus exp (expt a b) (expt c d))
(sqrt (diff (sin x) (cos y) (ln z))))
)
Новая префиксная нотация:
(+
(/
(* a b c)
(/ m n k))
(/
(+ (exp x) (expt a b) (expt c d))
(sqrt (- (sin x) (cos y) (ln z))))
)
2) Представить выражение на ЛИСПе в новой нотации и математической форме. Задав значения переменных, вычислить выражение:
(difference (quotient (sqrt (plus (sin x) (cos x))) (sub1 y)) (times (add1 x) (log z))).
Новая нотация:
(- (/ (sqrt (+ (sin x) (cos x))) (1- y)) (* (1+ x) (log z)))
Математическая форма:
Вычисление выражения:
>(- (/ (sqrt (+ (sin 1) (cos 1))) (1- 2)) (* (1+ 1) (log 100)))
Значения переменных:
x=1,y=2,z=100
Результат:
-8.034852
3) Задан список N: (setq N ‘((gk ij kl) (ab cd ef))).
а) Сформировать с помощью комбинаций встроенных функций CAR и CDR языка ЛИСП запрос к списку N, возвращающий элемент ij.
> (cadar N)
IJ
б) Определить значения следующих S-выражений:
> (last N)
((AB CD EF))
>(delete ‘kl N)
((GK IJ KL) (AB CD EF))
>(reverse N)
((AB CD EF) (GK IJ KL))
>(cons ‘a N)
(A (GK IJ KL) (AB CD EF))
>(append N N)
((GK IJ KL) (AB CD EF) (GK IJ KL) (AB CD EF))
4) Определить значение следующего S-выражения:
>(and (number 3) (greaterp 4 2 1) (equal (setq x 1) 1)).
T
Тема №2: "Разработка и применение пользовательских функций"
Разработать пользовательские функции, используя функцию DEFUN. Продемонстрировать применение разработанных функций. Каждый пункт индивидуального задания выполнять в соответствии со специальными требованиями.
Используя только встроенные алгебраические и логические функции.
Функция, вычисляющая площадь параллелограмма по длине диагонали и углу между диагоналями.
>(defun area (a b c)
(setq L (* (/ 1 2) a b (sin c)))
)
>(area 1 2 3)
0.14112
Использовать функционалы APPLY и MAPCAR.
Функция, вычисляющая среднее арифметическое значение числового списка.
>(defun arifm (x)
(/ (apply '+ x) (length x))
)
>(arifm '(9 4 8))
Используя условную функцию COND.
Функция, программирующая нелинейную зависимость
“петля гистерезиса“.
>(defun hister (x a b)
(cond ((or (>= x a)) (setq y b))
((or (<= x (* a -1))) (setq y (* b -1)))
((or (< (abs x) a)))
(T (setq y y))
))
(hister 5 3 6)
(hister 6 4 8)
(hister -5 3 9)
-9
Используя рекурсивные вызовы пользовательских функций.
Рекурсивная функция, вычисляющая число Ʈ (“золотое сечение“) с помощью бесконечной цепной дроби.
>(defun tet (n)
(if (= n 0) 0
(/ 1.0 (+ 1 (tet(1- n )))))
)
>(tet 15)
0.618034
5)Используя λ-функции разработать функцию, вычисляющую сумму элементов числового списка, возведённых в степень с показателем 3/2.
>(defun summa (x)
(apply '+ (mapcar (lambda (z) (expt z 1.5)) x))
)
>(summa '(5 4 7 1 3))
43.896752
Итоговое задание: