7.7. Рекурсия в подпрограммах
Объект называется рекурсивным, если он определяется с помощью самого себя.
С рекурсией мы уже встречались при определении понятий операнд -выражение, а также при описании списков. Язык Паскаль допускает рекур-сивное описание подпрограмм, т.е. в разделе операторов возможно обращение подпрограммы к самой себе непосредственно или через другую подпрограм-му.
Пример 7.6.1. Реализовать рекурсивное вычисление факториала, ис-пользуя тот факт, что
FUNCTION Fact(k:integer):longint;
BEGIN
IF k>0 THEN Fact:=k*Fact(k-1)
ELSE Fact:=1
END .
Заметим, что обращение к функции Fact(k-1) не есть запрещенное правилами языка использование имени функции в правой части оператора присваивания.
Более сложной является взаимная рекурсия: подпрограмма A обра-щается к подпрограмме B, а подпрограмма B обращается к подпрограмме A. Обычным образом описать эти две подпрограммы невозможно, поскольку, например, при попытке описать подпрограмму A придется включить в опи-сание еще не объявленный объект: подпрограмму B. Эту проблему разрешает механизм опережающего описания: для одной из подпрограмм сначала зада-ется только заголовок (интерфейсная часть), а вместо блока - служебное слово FORWARD. Затем после полного описания другой подпрограммы приво-дится полное описание первой, но в заголовке указывается только ее имя.
Пример 7.6.2. Для целых n реализовать вычисление функций: PROGRAM Forw;
VAR n : integer;
FUNCTION f(k:integer):real; FORWARD;
FUNCTION g(k:integer):real;
BEGIN
IF k<=0 THEN g:=5
ELSE g:=Sqrt(k*f(k-1))
END;
FUNCTION f;
BEGIN
IF k<=0 THEN f:=1
ELSE f:=k*k*g(k-1)
END;
BEGIN
Write('n = '); ReadLn(n);
WriteLn(n, f(n):20, g(n):20 )
END.
Важный момент для рекурсивных алгоритмов - окончание процесса. В при-веденных примерах - это условие k £ 0 .
Желающим детальнее ознакомиться с проблемами рекурсии в про-граммировании можем порекомендовать, например [ 2 ].