Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ФЛ ответы.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
27 Кб
Скачать
☆

7. Создание локальной связи с помощью формы let и let*. Эквивалентное представление формы через λ-вызов.

(Let ((m1 a1) (m2 a2) … (mn an)) форма1 форма2 …)

Вычисляется форма следующим образом: переменные m1,m2,m3,…,mn, из первого аргумента формы связываются одновременно с соответсвующими значениями a1,a2,a3,…,an. Затем слева направо вычислятся значения форма1, форма2, …. В качестве значения все формы возвращается значение последней формы. После окончания вычислений связи переменных m1,m2,m3,…,mn ликвидируются.

(Let ((x 2) (y 3)) (+ (* 2 x) y))

((Lambda (x y) (+ (* 2 x) y)) 2 3)

8. Разветвление вычислений через формы cond и if. Особенности вычисления логических функции not,and,or.

Структура формы COND: (Cond (p1 a1) (p2 a2) … (pn an)), pi – предикаты произвольной формы, аi – результирующие выражения.

Выражения pi вычисляются последовательно слева направо, пока не будет получено значение истина. Затем вычисляется соответствующее выражение ai, и полученное значение возвращается в качестве результирующего выражения все формы COND. Если истинного предиката нет, то возвращается значение NIL.

Форма IF имеет вид (if p a1 a2), p – предикат, а1, а2 – вычисляемая форма.

Значением формы является a1, если p истина, и а2 если p ложь.

NOT

(not x)

Если х – nil, то t

Если не nil, то nil

OR

(or p1 p2 ….pn)

Если встречает аргумент не nil, то выдает его знаечение и заканчивает работу

Если все nil, то nil.

AND

(and p1 p2…. Pn)

Вычисляется слева направо, если встречает nil, то выдает nil. Если nil – нет, то выдает последний аргумент.

9. Ввод и вывод в лисПе. Функции read,print,prin1, princ, terpri, format.

READ чтение с клавиатуры

>(read)

(1 2 3)

(1 2 3)

PRINT – вычисляет значение аргумента, и выводит вычисленное значение

>(print (+ 1 2))

3

3

PRIN1 работает также как PRINT, но не переводит строку и не печатает пробел.

PRINC – может напечатать строку без ограничивающих ее двойных кавычек

TERPRI – переводит строку, не имеет аргументов, в качестве значения возвращает NIL.

(FORMAT поток образец аргумент)

Поток – файл, дисплей. T –вывод на дисплей.

Образец – ограничивается с обеих сторон кавычками, управляющая строка, которая может содержать текст. Опознается до знака “~” перед ними.

Аргумент – ставится в соответсвии с управляющим кодом.

10. Работа с файлами в лиспе.

Если определения функции хранятся в файле лежащим в папке с интерпритатором то их можно загрузить функцией (load имя-файла).

В ЛИСПЕ ввод-вывод осуществляется через потоки. Открытый поток связывается с символьным атомом.

(setq f (open имя-файла :direction параметр)

В качестве параметра указывается одно из значений:

:input – открыть для ввода

:output – открыть для вывода

:io – для ввода-вывода

Запись в файл и чтение из файла производится функциями (PRINx поток) и (READ поток).

11. Системные свойства символа и список свойств, определяемых пользователем. Получение, присваивание, изменение и удаление свойств.

12. Простая рекурсия. Определение и примеры. Рекурсия по значению и аргументу.

Рекурсия называется простой, если рекурсивный вызов в некоторой ветви встречается один раз.

Если рекурсивный вызов в некоторой ветви определяет результат функции – рекурсия по значению.

Если рекурсивный вызов определяемой функции стоит в аргументе другой функции – рекурсия по аргументу.

13. Основные приемы определения рекурсивных функций: вспомогательные функции, накапливающие параметры, локальные определения подфункций. Примеры.

Вспомогательные функции служат подпрограммами для основной функции, которая является главной программой.

накапливающие параметры – определяется вспомогательная функция с лишним параметром, который используется для накопления результата.

(defun r (x y)

(cond ((eq x nil) y)

(t (r (cdr x) (cons (car x) y)))))

14. Другие формы рекурсии: параллельная, взаимная и рекурсия более высокого порядка. Примеры.

Параллельная – тело определения функции f содержит вызов некоторой функции g, несколько аргументов которой являются рекурсивными вызовами функции f.

(defun f …

…(g …(f …)…(f…)…)

…)

(defun copy2 (x)

(cond ((eq x nil) nil)

((atom (car x)) (cons (car x) (copy2 (cdr x))))

(t (cons (copy2 (car x)) (copy2 (cdr x))))))

Взаимная – в определении функции f вызывается некоторая функция g которая содержит вызов функции f.

(defun f…

… (g …) … )

(defun g …

… (f …) … )

(defun mov (x y)

(cond ((eq x nil) y)

(t (mov (cdr x) (cons (rev2 (car x)) y)))))

(defun rev2 (x)

(cond ((atom x) x)

(t (mov x nil))))

Рекурсия более высокого порядка – аргументом рекурсивного вызова является рекурсивный вызов.

(defun f …

… (f … (f … ) … )

… )

(defun lev (x y)

(cond ((eq x nil) y)

((atom x) (cons x y))

(t (lev (car x) (lev (cdr x) y)))))

(defun level1 (x)

(lev x nil))