Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯП / ЯП / ЯП экзамен.doc
Скачиваний:
239
Добавлен:
11.05.2015
Размер:
322.05 Кб
Скачать
  1. Программный стек и его изменение.

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

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

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

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

  1. Рекурсивный и итерационный методы решения задач. Виды рекурсий.

Рекурсия.

Описание объектов или вычисления в терминах самого себя. Обращение подпрограммы к самой себе.

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

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

Виды рекурсий.

  1. Линейная рекурсия – выполнение тела подпрограммы приводит не более чем к одному рекурсивному вызову. Существует линейная цепочка вызовов. Вычисление факториала.

  2. Повторная рекурсия – разновидность линейной рекурсии, когда рекурсивный вызов внутри подпрограммы является последним оператором. Отсутствуют какие-либо предварительные, или отложенные вычисления. В этом случае все действия подпрограммы выполнены и управление передается в другой вызов, а внутреннее состояние можно забыть. В этом случае нет необходимости сохранять все предыдущие промежуточные значения и результатом вычислений является последний вызов.

  3. Каскадная рекурсия – возникает, если при выполнении тела подпрограммы, рекурсивные вызовы могут возникнуть более одного раза. Древовидная схема вызовов.

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

  5. Удаленная рекурсия – если в теле функции при рекурсивных вызовах в выражении являющихся фактическими параметрами, снова встречаются рекурсивный вызов этой функции.

Недостатки рекурсивного подхода:

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

Соседние файлы в папке ЯП