Основы программирования. Файлы. Рекурсия - 22 стр.

UptoLike

Составители: 

24
Пример 3.
procedure p(n: integer);
begin
if n>0 then p(n-1);
write(n,' ');
end;
При вызове
p(5) вначале проверится условие n>0 и, поскольку оно истинно,
вызовется
p(4), затем p(3) и т.д. до p(0). Так как при вызове p(0) условие n>0
уже не выполняется, то осуществится вывод
0 и произойдет выход из вызова
p(0) в вызов p(1) сразу после условного оператора. Далее осуществится вывод 1
и выход из вызова
p(1). Процесс возврата из уже сделанных рекурсивных вызо-
вов продолжится, пока не будет осуществлен выход из вызова
p(5). В результате
на экран будет выведено
0 1 2 3 4 5
Схема рекурсивных вызовов в примерах 2 и 3 изображена на рисунке:
Процесс рекурсивных вызовов называется рекурсивным спуском, а процесс
возврата из них рекурсивным возвратом. Глубиной рекурсии называется мак-
симальное число вложенных рекурсивных вызовов (в примерах 2 и 3 глубина ре-
курсии равна 5). Число вложенных рекурсивных вызовов в данный момент вы-
полнения программы называется текущим уровнем рекурсии.
Отметим, что в примере 2 действия осуществляются на
рекурсивном спуске,
поэтому порядок действийпрямой (в порядке вызова рекурсивных процедур). В
примере 3, напротив, действия осуществляются на рекурсивном возврате, т.е. от-
кладываются до достижения наивысшей глубины рекурсии, после чего начинают
выполняться в порядке, обратном порядку вызова.
Реализуем рекурсивные функции из примеров в начале пункта.
Пример 4. Вычисление n!
Реализация повторяет
рекурсивное определение n!, данное в начале главы:
function Nfact(n: integer): integer;
begin
if n=0 then
Result:=1
else Result:=n*Nfact(n-1);
end;