Используя рекурсивные вызовы пользовательских функций.

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

МОСКОВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ

(НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ)

____________________________________________

 

Факультет №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

 

 

Итоговое задание: