Иллюстрированный самоучитель по Tirbo Pascal


Рекурсия и опережающее описание - часть 2


Program Factorial;

{$S+,N+,E+} {Включаем контроль Стека и работу сопроцессора} 

var

n: Integer;

Function Fac(n: Integer): extended; 

var

F: extended; {Буферная переменная

для разгрузки стека сопроцессора}

{Рекурсивная функция, вычисляющая п! } 

begin {Рас} 

if n < 0 then

WriteLn ('Ошибка в задании N') else

if n = 0 then

Fac := 1 else begin

F := Fac(n-l) ; Fac := F * n end end {Fac} ;

{--------------}

begin {main} 

repeat

ReadLn (n) ;

WriteLn ('n! = ',Fac(n)) 

until EOF 

end {main} .

Рекурсивный вызов может быть косвенным. В этом случае подпрограмма обращается к себе опосредованно, путем вызова другой подпрограммы, в которой содержится обращение к первой, например:

Procedure A (i : Byte) ; 

begin

.......

В (i);

.......

end ;

Procedure В (j : Byte) ;

.......

begin

.......

A(j);

.......

end;

Если строго следовать правилу, согласно которому каждый идентификатор перед употреблением должен быть описан, то такую программную конструкцию использовать нельзя. Для того, чтобы такого рода вызовы стали возможны, вводится опережающее описание:

Procedure В(j : Byte); forward;

Procedure A(i : Byte);

begin

.......

В (i) ;

.......

end ;

Procedure В; 

begin

.......

A(j);

.......

end;

Как видим, опережающее описание заключается в том, что объявляется лишь заголовок процедуры В, а ее тело заменяется стандартной директивой FORWARD. Теперь в процедуре А можно использовать обращение к процедуре В - ведь она уже описана, точнее, известны ее формальные параметры, и компилятор может правильным образом организовать ее вызов. Обратите внимание: тело процедуры В начинается заголовком, в котором уже не указываются описанные ранее формальные параметры.




Начало  Назад  Вперед



Книжный магазин