
196
Гл. 3. Машинно-ориентированные алгоритмические языки
funct
iiprim
a
(int
n
со nt I co)
bool:
if n=l
then false
else
var int
nwar:=2i
while
n mod
mvar^Q
do
nwar:=mvar
-I-1
od;
It
fi
function
hprlm (л : integer
{« 51]): Boolean;
var
rate/
1
:
integer;
begin
if и = I
then
isprim
-a
false
else
begin nwar'.*>2',
while
и mod miw + 0 do
end
isprim
end
Рис.
98.
Повторительные подпрограммы, в
телах
которых встречается
несколько
(гладких) вызовов, можно преобразовать в рассмот-
ренную выше форму с одним-единственным (гладким) вызовом:
для этого нужно только распространить действие стражей, под
охраной которых находятся отдельные вызовы, на аргументы
вызовов. Как это сделать, проиллюстрировано на примере
в
3.3.5.
Итак,
если ограничиться исключительно повторительными
подпрограммами, то можно обойтись использованием одних
лишь
переменных и операторов цикла. При этом мы по-преж-
нему можем считать их способом сокращённой записи для осо-
бенно
простого случая рекурсии. С
другой
стороны, мы можем
также, следуя историческому развитию, подвести под всё это
внешне
нерекурсивную семантику; для этого нужно не только
отождествить разные воплощения формуляра, но и вынести
наружу стопки промежуточных результатов, т. е. пере-
менные.
Тем самым выполнение вычисления („исполнение") сводится
к
движению
по программному формуляру, а
состояние
вычисле-
ния
определяется последними текущими значениями используе-
мых программных переменных и позицией в программном фор-
муляре.
Разумеется, групповые присваивания
могут
выполняться
параллельно, если для этого имеется необходимое оборудо-
вание.
Подпрограммы, которые, подобно рассмотренным в этом раз-
деле, содержат повторения, но не обнаруживают рекурсии, так-
же называют
итеративными.
Формальная
семантика итеративных формулировок
будет
рассмотрена в гл. 8.