Рекурсивные процедуры и функции имеют одну из двух форм: прямую или косвенную. Если процедура или функция р содержит явную ссылку на саму себя, это называется прямой рекурсией. Но может встретиться ситуация когда подпрограмма red ссылается на другую подпрограмму гес2, содержащую, в свою очередь, ссылку на red. To есть одна подпрограмма вызывает другую, которая либо сама, либо посредством других подпрограмм вызывает исходную. В этом случае мы имеем дело с косвенной рекурсией. Схема вызова в этом случае такова: red —> гес2 —> red.
В случае косвенной рекурсии возникает проблема: как и где описать вызываемую подпрограмму. По правилам языка Паскаль вызываемая подпрограмма должна быть описана до ее вызова. Но если red вызывает гес2, а гес2 вызывает red, то получается замкнутый круг. Для подобных ситуаций принято следующее правило: одна из вызывающих друг друга рекурсивных подпрограмм описывается предварительно следующим образом:
procedure <имя> (<список формальных параметров>); forward;
где <имя> — имя процедуры; forward — служебное слово, указывающее транслятору, что текст процедуры с именем <имя> помещен ниже. Аналогично описывается функция. Список параметров процедуры или функции и тип результата (для функции) включается только в предварительное описание и опускается в ее полном описании.
Например, пусть функция а вызывает функцию Ь, которая, в свою очередь, вызывает функцию а. Тогда эти функции можно описать следующим образом:
function a(x: integer): real; forward;
function b(y: integer): real; begin
b:=a(k)+3.5 end;
function a; begin
a:=b(m)-1.8 end.