- •Какие из перечисленных функций языка Лисп являются функциями с побочными эффектами: print, list, car, setq, do?
- •Где целесообразно использовать рекурсивные функции?
- •Достоинства :
- •Чем отличаются атомы и символы?
- •Что такое чистый функциональный язык? Пример чистого и «нечистого» языка.
- •Как отразился на функциональных языках тот факт, что лямбда-исчисление было придумано математиком?
- •Бесконечные структуры данных: где возможно использовать.
- •Что такое предикат? Какие из перечисленных функций являются предикатами: atom, listp, list, car, append?
- •Что такое взаимная рекурсия?
- •Что называют функциями с побочными эффектами?
- •Чем отличаются s-выражения и списки?
- •Основные особенности лямбда-исчисления.
- •Смысл использования функций высшего порядка.
- •Где используются продолжения? Что делать с продолжением, если функция не возвращает значения (например, вывод данных)?
- •В каком случае используется несколько рекурсивных ветвей?
- •Что такое параллельная рекурсия?
- •Что такое функционал?
- •Что в Лиспе понимается под формой?
- •Где чисто функциональные программы хранят свое текущее состояние?
- •Недостатки рекурсии.
- •Почему функциональное программирование называется функциональным?
- •Что такое оптимизация хвостовой рекурсии?
- •Где оправдан карринг?
- •Что общего между функциональным и объектно-ориентированным программированием?
- •Что такое родительская область видимости?
- •Что называют псевдофункциями?
Где чисто функциональные программы хранят свое текущее состояние?
Оказывается, что функциональные программы могут хранить состояние, только они не используют для этого переменные. Они используют функции. Состояние хранится в параметрах функции, в стеке. Если хотите сохранить состояние, чтобы потом изменить его через время, то нужно написать рекурсивную функцию. В функциональной программе всё состояние хранится в стеке в виде аргументов функций.
Недостатки рекурсии.
основной недостаток рекурсии — повторные вычисления одних и тех же значений. Кроме того, с рекурсивными функциями связана одна серьезная ошибка: дерево рекурсивных вызовов может оказаться бесконечным и компьютер «зависнет». Важно, чтобы процесс сведения задачи к более простым когда-нибудь заканчивался.
Наиболее очевидная опасность заключается в бесконечной рекурсии. Если вы неверно построите алгоритм, то функция может пропустить основное условие и вы- полняться бесконечно. Проще всего допустить эту ошибку, если не указать условие установки,
Функция будет зацикливаться, если основное условие не учитывает все воз- можные пути рекурсии.
Последняя проблема, связанная с бесконечной рекурсией, состоит в том, что «бесконечная» в действительности означает «до тех пор, пока не будет исчерпана вся память стека». Даже корректно написанные рекурсивные процедуры иногда приводят к переполнению стека и аварийному завершению работы
Как заставить «ленивую» программу выполнять действия?
В ленивом языке невозможно работать с вводом-выводом, обращаться к функциям, которые обладают побочными эффектами и должны вызываться в правильном порядке. Приёмы, обеспечивающие правильный порядок в ленивом функциональном окружении: – продолжения (continuations); – монады (monads); – уникальная типизация (uniqueness typing).
Запишите общую форму определения рекурсивной функции.
Общая форма определения рекурсионной функции
(defun <имя> <параметры> (cond (терминальная ветвь1) (терминальная ветвь2) ................... (терминальная ветвьn) (рекурсивная ветвь1) (рекурсивная ветвь2) .................... (рекурсивная ветвьn)))
В каком случае используется несколько терминальных ветвей?
Однако в определении рекурсивной функции может быть несколько терминальных ветвей. Две терминальные ветви будут в том случае, когда ведется поиск цели в последовательности значений и мы желаем получить результат, как только цель найдена.
Ветвь 1. Цель найдена и надо вернуть ответ
Ветвь 2. Цель не найдена и нет больше элементов.
|
Что называется мусором? Привести пример.
Мусором называются Лисп-ячейки, недоступные через символы и
указатели. Мусор образуется в двух случаях :
•Вычисленная структура не сохраняется с помощью SETQ;
•Теряется ссылка на старое значение в результате побочного эффекта
нового вызова SETQ или другой функции.
Пример1.
Значение вызова (list ‘a ‘b) лишь печатается, после чего
соответствующая ему структура ‘(a b) остается в памяти мусором.
Память, которая больше не нужна, называется garbage(мусор), И операции по ее очистке называются garbage collection, или GC.