Рекурсия
В Паскале подпрограммы могут обладать свойством рекурсии, то есть в ходе
работы подпрограмма может вызывать сама себя. Различают 2 формы
рекурсии: прямую и косвенную. При прямой рекурсии процедура содержит
оператор обращения к самой себе: A-AПри косвенной рекурсии одна процедура
вызывает другую, которая сама либо посредством других процедур вызывает
исходную процедуру: A-B-AПри выполнении правильно организованного
рекурсивного блока осуществляется многократный последовательный переход
от некоторого текущего уровня организации алгоритма к нижнему уровню до
тех пор, пока не будет найдено условие, при котором рекурсия останавливается.
В этом случае процедура обращается к себе опосредованно, косвенно, путем
вызова другой процедуры, в которой содержится обращение к первой процедуре.
При создании косвенной рекурсии возникает проблема: как описать вызываемую
процедуру. Как известно, в Паскале все переменные, константы, метки, процедуры
должны быть описаны до того, как будут упомянуты в операторах или выражениях,
в противном случае компилятор объявит их имена неизвестными. В косвенной
рекурсии процедура "А" вызывает процедуру "В", которая не описана. Выход из
ситуации в следующем: используется опережающее описание с помощью директивы
FORWARD. Эта директива объявляет только заголовок вызываемой процедуры,
заменяя собой тело процедуры, откладывая описание содержимого
(раздела операторов) на дальнейшее. Местоположение раздела операторов уже
не играет роли, и в нем можно не указывать формальные параметры, а
ограничиться лишь именем подпрограммы:
Оператор перехода. Пустой оператор
В Паскале принят естественный порядок выполнения операторов, т.е. операторы
обычно выполняются в порядке их следования в тексте программы. Между тем
ОПЕРАТОР ПЕРЕХОДА позволяет задавать любой желаемый порядок выполнения
вычислений.Оператор перехода указывает, что далее программа должна выполняться
с места, помеченного указанной в операторе меткой. Оператор перехода имеет
вид: goto:метка; Любой оператор в программе может быть помечен, т.е. снабжен
меткой, которая предшествует оператору и отделяется от него двоеточием:
МЕТКА : ОПЕРАТОР ; Метка может иметь произвольное имя, в качестве меток
также допускается использовать целые числа без знака. Используемая в программе
метка должна быть описана в блоке LABEL раздела описаний. Если в программе
несколько меток, то в блоке LABEL они приводятся в виде списка, отделяясь друг
от друга запятыми: LABEL 25, 0, Loop, 21, lab1; Порядок перечисления меток в списке
безразличен. При использовании меток необходимо учитывать, что метки, описанные
в подпрограмме (процедуре, функции), локализуются в ней, поэтому переход извне
подпрограммы на метку внутри нее невозможен. Также невозможен переход из
подпрограммы на метку, расположенную в основном блоке программы. Следует помнить,
что частое использование оператора перехода ухудшает наглядность программы,
затрудняет ее понимание и отладку. Еще в марте 1968г. на эту тему была опубликована
историческая статья голландского программиста Эдсгера Дейкстри
"GOTO Statement Considered Harmful" ("о вреде оператора GOTO"). Использование
оператора перехода обосновано лишь в отдельных случаях, например для досрочного
выхода из цикла или перехода в конец программы для окончания ее работы
ПУСТОЙ ОПЕРАТОР не предписывает никаких действий, он представляет собой
пустую последовательность символов (т.е. отсутствие символов). Как и обычные
операторы, пустой оператор может быть помечен меткой. Пустой оператор отделяется
от других операторов точкой с запятой. Наиболее часто пустой оператор используется
для того, чтобы поместить в программе "точку", на которую должен осуществляться
переход по оператору перехода, но при этом не надо выполнять никаких
дополнительных действий; например, надо просто выйти из программы - для этого
ставим пустой оператор с меткой перед словом end: