
2.3. Подпрограммы 139
вызовов. Ещё наглядней случай
линейной
рекурсии,
при кото-
рой,
кроме того, в отдельных ветвях разбора случаев рекурсив-
ный
вызов встречается не более одного раза;
тогда
при
каждом воплощении порождается не более одного нового
воплощения.
Впрочем, почти все ранее изложенные примеры
попадают в этот класс.
Для подпрограммы fac из 2.3.2 машина обработки формуля-
ров работает, как показано на рис. 72. Типичным для рекурсии
•является „задерживание" вычислений, откладывание их „на
потом",—
лишь когда на воплощении
fac
(i)
заканчивается ре-
курсия,
становятся выполнимыми и выполняются вычисления,
отложенные на потом ' в /ас
(2)
,
fac
m
и
fac^
0)
;
окончательный ре-
зультат
поставляет основной формуляр /ас
<0)
. В частном слу-
чае выполнение отложенных операций может свестись к про-
стой передаче результатов отдельных воплощений, как это по-
казано
на рис. 73 для примера вызова
gcdl
(15, 9), см.
2.3.2.
Такие
вызовы называются
гладкими
(или
регулярными).
Если
в
линейной рекурсии имеются только гладкие вызовы, то гово-
рят о
повторительной
рекурсии.
В линейно-рекурсивных программах — если отвлечься от уже
упоминавшейся совместности для формуляра — порядок, в кото-
ром порождаются требуемые воплощения, определён однозначно.
В общем
случае
это не всегда так: если в какой-то ветви имеется
несколько
вызовов, то при определённых условиях возможны
различные порядки порождения и
даже
параллельная ра-
бота.
Это отражено на рис. 74 для примера программы
sort
из
2.3.2,
в предположении что выполняется двоичная сортировка.
Здесь для последовательности знаков длины 2" получается ров-
но
2"
+|
— 1 воплощений, но всего лишь п + 1 тактов, при
линейной
же сортировке требуется 2" воплощений, но зато 2" так-
тов. Также и в отношении расхода времени на сравнение зна-
ков,
которое необходимо проводить при исполнении подпро-
граммы
merge,
двоичная сортировка выгодней: она
требует
мак-
симум (п—1)Х2+ 1 сравнений, в то время как линейная
сортировка — до 2"-
1
Х(2" — 1) сравнений.
Во
всех
предыдущих примерах молчаливо принималось оче-
видное правило: начинать новое воплощение, а значит и созда-
вать новый формуляр только
тогда,
когда все аргументы под-
готовлены. Это всегда
будет
предполагаться и в дальнейшем,
т. е. мы принимаем следующий принцип:
Определённая
посредством
описания
подпрограммы
опера-
ция
всегда
рассматривается
как
строгая.
1
На рис. 59 ромбики, отвечающие задержанным операциям, заштрихо-
ваны.