Задача. Написать рекурсивную процедуру вычисления факториала целого положительного числа n (т.е. произведения чисел 1..n, обозначаемого n!). Решение. Используем равенства 1!=1, n!= (n-1)!*n.
procedure factorial (n: integer; var fact: integer);
| {положить fact равным факториалу числа y}
begin
| if n=1 then begin
| | fact:=1;
| end else begin {n>1}
| | factorial (n-1, fact);
| | fact:= fact*n;
| end;
end;
С использованием процедур-функций можно написать так:
function factorial (n: integer): integer;
begin
| if n=1 then begin
| | factorial:=1;
| end else begin {n>1}
| | factorial:= factorial (n-1)*n;
| end;
end;
Обратите внимание на некоторую двойственность использования имени factorial внутри описания функции: оно обозначает как переменную, так и вызываемую рекурсивно функцию. К счастью, в нашем
случае они различаются по скобкам после имени, но если бы функция была без параметров, то дело было бы плохо. (Стандартная, но трудно находимая ошибка возникает, если автор полагает, что он использует значение переменной, а компилятор в этом месте видит рекурсивный вызов.)