Разработка и реализация программ с использованием процедур и функций, страница 3

Область действия имени. Описание имени (константы, типа, переменной, процедуры, функции) распространяется на весь блок, в котором содержится это описание. Область, в которой справедливое описание имени, определяется областью действия этого имени.

Имя, которое описано в блоке основной программы, называется глобальным. Имя, которое описано в блоке подпрограммы, называется локальным. Имя является глобальным относительно блока, если оно описано во внешнем (по отношению к заданному) блоку. Описание локального имени за пределами «своего блока» не определено. Если во вложенном блоке описанное локальное имя, что совпадает с глобальным, то областью действия этого локального имени будет «свой блок», за его границами действует описание глобального имени. Например, при выполнении программы

program ELR6;

var A,X,Y: real;

procedure D(var X,Y:real);

begin

А:=2*X;{смена значение глобальной переменной A=2*2=4}

В:=A*X+1 {Y=4*2+1=9}

end;

begin

А:=2; X:=3; В:=2;

D(Y,X);

В:=A*Y+X; {Y=4*2+9=17}

Writeln(X,Y)

end.

получаем результат: X= 9, Y= 17.

Побочным эффектом подпрограммы называют изменение значения глобальной переменной всередине подпрограммы. Если такой эффект не предусмотрен программистом специально, то он может стать источником ошибок, что достаточно трудно обнаружить. В привелённом выше примере побочным эффектом процедуры является изменение значения переменной А.

Если процедура или функция вызывает сама себя, то она называется рекурсивной. Глубина рекурсии, то есть количество вызовов, в системе Turbo Pascal не ограничивается. Реально она зависит от ресурсов памяти конкретного компьютера.

В общем случае рекурсивность - это не свойство самой процедуры или функции, а свойство ее описания. Рекурсивная подпрограмма, как правило, короче и более наглядная, но при выполнении требует больше времени и памяти за счет повторных обращений к самой себе и дублирование локальных переменных. Необходимо хорошо понимать, что каждый дежурный рекурсивный вызов приводит к образованию новой копии локальных объектов подпрограммы и все эти копии, что отвечают цепные активизированных и незавершенных рекурсивных вызовов, существуют независимо один от другого.