В теле подпрограммы известны (доступны) все объекты, описанные в блоке, в том числе и имя самой подпрограммы. Таким образом, внутри тела подпрограммы возможен вызов самой подпрограммы. Процедуры и функции, использующие вызовы “самих себя”, называются рекурсивными. Допустима косвенная рекурсия, при которой , например, процедура А вызывает процедуру В,а та, в свою очередь, вызывает процедуру С, которая вызывает первоначальную процедуру А.
Пример Вычисление факториала
0!=1; 1!=1; n!=1*2*3… (n-1)*n n!=(n-1)!*n.
function Fact (n: word): longint;
begin
if n=1 then
Fact:=1
else
Fact:=n*Fact(n-1)
end;
В языке Pascal нет никаких ограничений на рекурсивные вызовы подпрограмм. Необходимо только хорошо понимать, что каждый очередной рекурсивный вызов приводит к образованию новой копии локальных объектов подпрограммы. Все эти копии, соответствующие цепочке активизированных и незавершённых рекурсивных вызовов, существуют независимо друг от друга.
Результат выполнения программы program SideEffect.
Вывод на экран
100 0
10000 -10
0 0
Анализ возможных вариантов работы программы представлен в таблице. Результат сравнения результатов анализа и результата работы программы program SideEffect показывают, что первым осуществляется вызов change(z), а затем change(10).
Непосредственное использование глобальных переменных в подпрограммах может привести к нежелательным изменениям их значений. Контроль за непосредственным использованием глобальных переменных в подпрограммах осуществляется программистом.