
Комбинация прямой и обратной рекурсии
Третью форму рекурсивных подпрограмм покажем на примере следующей задачи.
Задача. Вывести на печать символы введенной строки 'HELLO' в обратном направлении.
Решение этой задачи выполнено в виде показанной ниже программы Reverse_String, использующей рекурсивную процедуру Reverse. Напомним, что функция EoLn возвращает значение, равное False, если строка еще не окончилась, и значение, равное True, когда считывается последний символ строки.
program Reverse_String;
procedure Reverse;
var
Ch : Char;
begin
if not EoLn then
begin
Read (Ch) ;
Reverse;
Write (Ch);
end
end;
begin
Reverse
end.
Если после запуска программы на выполнение в качестве входной строки ввести слово 'HELLO', то соответствующая такой исходной строке таблица трассировки по уровням рекурсии будет иметь следующий вид:
Рис.3. Трассировка значений параметров
Косвенная рекурсия
Косвенной или взаимной рекурсией называется организация вызовов нескольких процедур и функций по кругу (первая процедура вызывает вторую, вторая - третью, ..., n-я процедура вызывает первую).
Для реализации косвенной рекурсии при описании процедур и функций используется директива forward:
program Recurs;
procedure Rec1 (i : Byte); forward;
procedure Rec2 (i : Byte);
begin
Writeln ('рекурсия.');
Rec1(i)
end;
procedure Rec1;
begin
if i > 0 then
begin
Write ('Взаимная ');
Rec2 (i-1)
end
end;
begin
Reс1 (5)
end.
Результат:
Взаимная рекурсия.
Взаимная рекурсия.
Взаимная рекурсия.
Взаимная рекурсия.
Взаимная рекурсия.
Контрольные вопросы
Дайте определение рекурсии.
Какие формы принимает рекурсивная процедура? Приведите примеры.
Что такое рекуррентное выражение? Приведите примеры.
Дайте определение прямой и косвенной рекурсии.