Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 14-15_РЕкурсия.doc
Скачиваний:
22
Добавлен:
24.08.2019
Размер:
236.03 Кб
Скачать

Комбинация прямой и обратной рекурсии

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

Задача. Вывести на печать символы введенной строки '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.

Результат:

Взаимная рекурсия.

Взаимная рекурсия.

Взаимная рекурсия.

Взаимная рекурсия.

Взаимная рекурсия.

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

  1. Дайте определение рекурсии.

  2. Какие формы принимает рекурсивная процедура? Приведите примеры.

  3. Что такое рекуррентное выражение? Приведите примеры.

  4. Дайте определение прямой и косвенной рекурсии.