Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
7.DOC
Скачиваний:
1
Добавлен:
09.11.2018
Размер:
59.39 Кб
Скачать

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 ].

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]