Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lisp-ответы.docx
Скачиваний:
2
Добавлен:
12.09.2019
Размер:
58.14 Кб
Скачать
  1. Почему функциональное программирование называется функциональным?

Функциона́льное программи́рование — раздел дискретной математики и парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании (то есть тех, чей единственный результат работы заключается в возвращаемом значении, или другими словами, вычисление которых не имеет побочного эффекта).

  1. Что такое оптимизация хвостовой рекурсии?

Хвостовая рекурсия — специальный случай рекурсии, при котором рекурсивный вызов функцией самой себя является её последней операцией.[1] Подобный вид рекурсии примечателен тем, что может быть легко заменён на итерацию, что реализовано во многих

оптимизирующих компиляторах.

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

Предположим, что процедура вызывается последний раз, т. е. когда вызванная процедура завершит работу, вызывающая процедура не возобновит свое выполнение. Это значит, что вызывающей процедуре не нужно сохранять свое состояние, потому что эта информация уже не понадобится. Как только вызванная процедура завершится, работа процессора должна идти в направлении, указанном для вызывающей процедуры после ее выполнения.

    Например, допустим, что процедура А вызывает процедуру B, а B - C в качестве своего последнего шага. Когда B вызывает CB не должна больше ничего делать. Поэтому, вместо того чтобы сохранить в стеке процедуры B информацию о текущем состоянии C, вы можете переписать старую сохраненную информацию о состоянии B на текущую информацию о C, сделав соответствующие изменения в хранимой информации. Когда C закончит выполнение, она будет считать, что она вызвана непосредственно процедурой А.

    Предположим, что на последнем шаге выполнения процедура B вместо процедуры C вызывает себя. Получается, что когда B вызывает B, стек (состояние) для вызывающей B должен быть заменен стеком для вызванной B. Это очень простая операция, просто аргументам присваиваются новые значения и затем выполнение процесса возвращается в начало процедуры B.

    Эта операция называется оптимизацией хвостовой рекурсии (tail recursion optimization) или оптимизацией последнего вызова (last-call optimization). 

  1. Где оправдан карринг?

  1. Что общего между функциональным и объектно-ориентированным программированием?

Если замыкание обращается к переменной, которой нет в локальной области видимости, тогда оно принимает во внимание родительскую область. Вот и всё! Замыкание связывает функциональный мир с миром ООП. Каждый раз, когда вы создаёте класс, который хранит некоторое состояние, и передаёте его куда-то, вспомните про замыкания. Замыкание — это всего лишь объект, который создаёт «атрибуты» на лету, забирая их из области видимости, чтобы вам не пришлось делать это самим.

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

Рекурсию более высокого порядка, когда аргументом рекурсивного вызова является рекурсивный вызов: (defun f ... ...(f...(f ...)...)

  1. Что такое CDR-рекурсия, и в каком случае она применяется?

Рассмотрена рекурсивная обработка чисел. Когда информация представлена в виде списка, то появляется необходимость рекурсивной обработки списков. Основная рекурсия над спискамиCDR рекурсия.

  1. Какая рекурсия называется простой?

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

некоторой ветви лишь один раз. Простой рекурсии в процедурном

программировании соответствует обыкновенный цикл.

  1. Какой вариант предиката предпочтительнее и почему?

      1. а) (defun pred1 (x) б) (defun pred2 (x)

        1. (and (numberp x) (plusp x))) (and (plusp x) (numberp x)))

  2. Для чего используется параллелизм?

  1. Ленивые вычисления: преимущества и недостатки

Преимущество ленивых вычислений в том, что некоторые процедуры, например, та же unless, могут выполнять полезные действия, даже если вычисление некоторых их аргументов способно привести к ошибке или бесконечному циклу.

Ленивые вычисления могут применяться в тех случаях, когда вызов функции связан с большими накладными расходами, которые было бы полезно отложить «на потом», поскольку при использовании ленивых вычислений ленивое значение может никогда не понадо- биться. Примером ленивого поведения является условный оператор if...then...else – в случае истинности условного выражения второе под- выражение никогда не вычисляется. Ленивые вычисления позволяют распространить такое поведение «вычислений по необходимости» на весь программный код.

Несмотря на все преимущества ленивых вычислений, их посто- янное использование по умолчанию ведет к снижению производи- тельности языка и затрудняет понимание программы разработчиком, привыкшим к традиционным алгоритмическим языкам, использую- щим энергичные схемы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]