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));