Ну так вот на многих сайтах с задачами (не только acmp.ru) я находил такое определение, как рекурсия. Не могли бы Вы рассказать всё (ну что Вы знаете), что нужно юному программисту, для знания данной темы.
function Fuctorial(n: integer): LongInt;
var
i: integer;
f: LongInt;
begin
f:=1;
for i:=1 to n do f:=f*i;
Factorial:=f
end;
function Fuctorial(n: integer): LongInt;
begin
if n=0 then Factorial:=1 else Factorial:=n*Factorial(n-1)
end;
program metro;
var N,F,R:longint;
begin
assign (input,'input.txt');
reset (input);
assign (output,'output.txt');
rewrite (output);
Read (N);
F:=1;
R:=1;
While R<=N do
Begin
F:=F*R;
R:=R+1;
If F mod 10=0 then Begin
F:=F div 10;
If F mod 10=0 then F:=F div 10
End;
If F>999999 then F:=F mod 10;
End;
If F mod 10<>0 then Write (F mod 10)
else Write (F mod 10);
End.
function Factorial(n: integer): LongInt;уже не хвостовая рекурсия, потому что рекурсивный вызов - не последний, после него есть еще вычисления... А разница - в том, что хвостовую рекурсию многие оптимизирующие компиляторы сводят к итерации, а значит, выполняться она будет быстрее и без доп. затрат памяти. Насчет Паскаль-компиляторов не знаю, чтоб кто-нибудь умел такое, но вот С++ компиляторы (в частности VC7+ от Microsoft, GCC из "GNU"-тых и ICC от Intel) прекрасно с данной задачей справляются.
begin
if n=0 then Factorial:=1 else Factorial:=Factorial(n-1)*n
end;