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

Оказывается, что функциональные программы могут хранить состояние, только они не используют для этого переменные. Они используют функции. Состояние хранится в параметрах функции, в стеке. Если хотите сохранить состояние, чтобы потом изменить его через время, то нужно написать рекурсивную функцию. В функциональной программе всё состояние хранится в стеке в виде аргументов функций.

 

  1. Недостатки рекурсии.

основной недостаток рекурсии — повторные вычисления одних и тех же значений. Кроме того, с рекурсивными функциями связана одна серьезная ошибка: дерево рекурсивных вызовов может оказаться бесконечным и компьютер «зависнет». Важно, чтобы процесс сведения задачи к более простым когда-нибудь заканчивался.

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

Функция будет зацикливаться, если основное условие не учитывает все воз- можные пути рекурсии.

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

  1. Как заставить «ленивую» программу выполнять действия?

В ленивом языке невозможно работать с вводом-выводом, обращаться к функциям, которые обладают побочными эффектами и должны вызываться в правильном порядке. Приёмы, обеспечивающие правильный порядок в ленивом функциональном окружении: – продолжения (continuations);  – монады (monads); – уникальная типизация (uniqueness typing).

  1. Запишите общую форму определения рекурсивной функции.

Общая форма определения рекурсионной функции

(defun <имя> <параметры> (cond (терминальная ветвь1) (терминальная ветвь2) ................... (терминальная ветвьn) (рекурсивная ветвь1) (рекурсивная ветвь2) .................... (рекурсивная ветвьn)))

  1. В каком случае используется несколько терминальных ветвей?

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

  • Ветвь 1. Цель найдена и надо вернуть ответ

  • Ветвь 2. Цель не найдена и нет больше элементов.

  1. Что называется мусором? Привести пример.

Мусором называются Лисп-ячейки, недоступные через символы и

указатели. Мусор образуется в двух случаях :

•Вычисленная структура не сохраняется с помощью SETQ;

•Теряется ссылка на старое значение в результате побочного эффекта

нового вызова SETQ или другой функции.

Пример1.

Значение вызова (list ‘a ‘b) лишь печатается, после чего

соответствующая ему структура ‘(a b) остается в памяти мусором.

Память, которая больше не нужна, называется garbage(мусор), И операции по ее очистке называются garbage collection, или GC.

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