В программировании рекурсивной называется подпрограмма, исполнение которой приводит к ее же повторному вызову.
Если подпрограмма просто вызывает сама себя, то такая рекурсия называется прямой. Например:
procedure rec1(k: byte); function rec2(k: byte): byte; begin begin ... ... rec1(k+1); x:= rec2(k+1); ... ... end; end; Если же несколько подпрограмм вызывают друг друга, но эти вызовы "замкнуты в кольцо", то такая рекурсия называется косвенной.
В случае косвенной рекурсии возникает проблема с описанием подпрограмм: по правилу языка Pascal, нельзя использовать никакой объект раньше, чем он был описан. Следовательно, невозможно написать в программе:
procedure rec_А(k: byte);begin ... reс_В(k+1); ...end;procedure rec_В(k: byte);begin ... rec_А(k+1); ...end; И здесь полезной оказывается возможность отрывать объявление подпрограммы от ее описания (см. лекцию 8). Например, для косвенной рекурсии в случае двух процедур, вызывающих друг друга (rec_A -> rec_B -> rec_A), нужно такое описание:
procedure rec_А(k: byte); forward;procedure rec_В(k: byte);begin ... reс_А(k+1); ...end; procedure rec_A;begin ... rec_В(k+1); ...end;
Пример рекурсивного алгоритма
Задача. Двумерный массив целых чисел представляет цвета клеток рисунка. Найдите самую большую связную область одного цвета. (Связи по диагонали не учитываются.)