Readln (n);
Begin
End;
Begin
Var
N : Integer;
Var
Program Factorial_Up;
End.
Readln ( n );
Begin
End;
Begin
Program Factorial_Down;
var n : Integer;
function Fact_Dn(Mult : Longint; i, m : Integer ) :Longint;
Mult := Mult * i;
{ Накопление факториала стоит до оператора рекурсивного вызова.}
{ Следовательно вычисление выполняется на спуске. }
if i = m then Fact_Dn := Mult
else Fact_Dn := Fact_Dn (Mult, i+1, m)
Write ('Введите число n: ');
Writeln ('Факториал n! = ' , Fact_Dn(1,1,n ));
Для демонстрации выполняемых функцией Fact_Dnдействий приведем таблицу трассировки значений ее параметров по уровням рекурсии. В этой таблице рассмотрен конкретный случай для n = 5.
Рис.1. Трассировка значений параметров
Рассмотренная выше программа Factorial, использующая рекурсивную функцию Fact, выполняет вычисление факториала на возврате. Но это не совсем очевидно, поскольку в функции Factрекурсивный вызов и операция умножения совмещены в одном операторе присваивания. Для более понятной демонстрации работы на возврате, приведем программу Factorial_Up, использующую функцию Fact_Up, в которой рекурсивный вызов и оператор накопления факториала разделены явным образом.
function Fact_Up(i :Integer) : Longint;
Mult: Longint;
if i = 1 then Mult := 1
else Mult := Fact_Up (i-1);
Fact_Up := Mult * i {Накопление факториала стоит после }
{оператора рекурсивного вызова. }
{Следовательно вычисление выполняется на возврате. }
Write ( 'Введите число n: ');
Writeln ('Факториал n! = ', Fact_Up (n));