{выводит строку длиной N в порядке, обратном тому, в котором эта строка вводилась.
Предусловие: N больше или равно единице.
Постусловие: выводит N символов}
var
next: char; {следующий символ}
begin
if N=1 then
begin {конечный шаг}
read (next);
write (next)
end
else
begin {рекурсия}
Read (next)
Reverse (N-1)
Write (next)
end
end;
Трассировка выполнения оператора REVERSE (3)
Значение N передается в процедуру при её вызове, так как N – её параметр.
Значение Next первоначально не определено, так как Next – локальная переменная.
Рекурсивный спуск завершается и начинается рекурсивный возврат, когда условие завершения становится истинным.
Последовательность действий для рекурсивного вызова Reverse (3)
Действия из одной записи активации представлены с одинаковым отступом.
Вызов Reverse со значением N, равным 3.
Считывание в NEXT первой буквы a.
Вызов Reverse со значением N, равным 2.
Считывание в NEXT второй буквы b
Вызов Reverse со значением N, равным 1.
Считывание в NEXT третьей буквы c.
Вывод третьей буквы c.
Возврат из третьего вызова.
Вывод второй буквы b.
Возврат из второго вызова.
Вывод первой буква a.
Возврат из первого вызова.
Стеки для локальных переменных и параметров
Stack -груда, куча, кипа, стопка (перевод с англ.) Структура данных-сравнение со стопкой тарелок. Когда имеет место очередной вызов такой рекурсивной процедуры, значение параметра, ассоциированное с этим вызовом, помещается на верх стека значений. При этом новая ячейка памяти (для следующего значения), содержимое которой изначально не определенно, присоединяется к стеку поверх только что занесенного туда значения. Например, если имеет место обращение к значению N или nextв процедуре Reverse, то используется соответствующее значение с верха стека. Если же имеет место рекурсивный возврат, значение, находящееся в данный момент на верху стека, удаляется и следующее значение перемещается на верх стека.
Состояние стеков при вызовах процедуры Reverse
После первого вызова процедуры Reverse
N
next
?
Непосредственно перед вторым вызовом процедуры Reverse буква а считывается в стек next
N
next
A
После второго вызова Reverse
N
next
?
a
Непосредственно перед третьим вызовом процедуры Reverse буква b считывается в стек next
N
next
b
a
После третьего вызова Reverse
N
next
?
b
a
В ходе выполнения процедуры в стеке next считывается c и тут же печатается, так как N в этот момент имеет значение 1(конечный шаг).
N
next
c
b
a
При рекурсивном возврате значения на верху стека удаляются
После первого возврата
N
Next
b
a
Управление возвращается оператору write, осуществляющему вывод значения b, находящегося в этот момент на верху стека next.
После второго возврата
N
Next
a
Управление передается оператору write, при осуществляется вывод значения c, находящегося на верху стека next.