Листинг программы
Program Factorial; {$S+, $N+, $E+}
{Включаем контроль переполнения стека и работу сопроцессора}
var n: integer;
function Fact (n: integer):real;
var F: extended;
{Рекурсивная функция, вычисляющая n!}
begin
if n < 0 then writeln ('Ошибка в задании N')
else
if n = 0 then Fact:= 1
else
begin
F:= Fact (n-1);
Fact:= F * n;
end;
end;
begin
repeat
readln (n);
writeln ('n! = ', Fact (n));
until EOF;
end.
Напишем процедуру, которая будет бесконечно печатать некоторую фразу. Обратим внимание, если операторы переставить.
Например,
Uses crt;
Procedure pop;
Begin
Writeln ('\У попа была собака...');
Pop;
End;
Begin
Pop;
End.
Но, если в теле процедуры изменить последовательность операторов:
Например,
Uses crt;
Procedure pop;
Begin
Pop;
Writeln ('У попа была собака...');
End;
Begin
Pop;
End.
Такое качество алгоритма вытекает из того, что рекурсивная процедура указывает, что нужно делать.
В нашем примере вызов копии процедуры происходит раньше, чем вызов процедуры.