Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СРС(ТА)2012_1.doc
Скачиваний:
5
Добавлен:
10.11.2019
Размер:
752.64 Кб
Скачать

Контрольные вопросы:

  1. Каково назначение отображения?

  2. Назовите команды работы с отображениями.

  3. Как реализовываются отображения? Стеки и рекурсивные процедуры.

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

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

Пример. Рассмотрим рекурсивное и нерекурсивное решения упрощенной версии классической задачи о ранце, где мы имеем целевое значение t и конечное множество положительных целых весов w1, w2, wn. Необходимо определить, можно ли из множества весов выбрать такой их набор, чтобы их сумма точно равнялась величине t. Например, если t = 10 и множество весов составляют числа 7, 5, 4, 4 и 1, то можно выбрать второй, третий и пятый веса, поскольку 5 + 4 + 1 = 10.

В листинге представлена функция knapsack (ранец), работающая с массивом весов weights:аггау[1..п] of integer. Функция knapsack(s,i) определяет, существует ли набор весов из множества весов от weights[i] до weights[ri], сумма которых равна s, и если есть, то печатает этот набор весов. В частном случае, когда s = 0, пустое множество весов считается решением. Если s < 0 или i > п (выход за заданное множество весов), то считаем, что решение не существует или не найдено (функция knapsack возвращает значение false).

Если ни один из перечисленных случаев к текущей ситуации не применим, то снова вызывается knapsack(s - w i ,i+ 1), чтобы посмотреть, существует ли решение, которое включает вес wi. Если в этом случае решение существует, то оно является и решением исходной задачи; это решение, включая wt, распечатывается. Если решения нет, то вызывается функция knapsack(s, i + 1) для поиска решения без участия веса wt.

Листинг . Рекурсивное решение задачи о ранце

function knapsack ( target: integer; candidate: integer) :.boolean;

begin

if target:= 0 then

return(true)

else if (target < 0) or (candidate > л) then

return(false)

else { ищется решение с и без candidate }

if knapsack(target-weights[candidate], Candidate+1)then

begin

writeln(weights[Candidate]);

return(true)

end

else { возможное решение без candidate }

return(knapsack(target, candidate +1))

end; { knapsack }

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