Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
10
Добавлен:
02.05.2014
Размер:
68.1 Кб
Скачать

Рекурсия

В Паскале подпрограммы могут обладать свойством рекурсии, то есть в ходе

работы подпрограмма может вызывать сама себя. Различают 2 формы

рекурсии: прямую и косвенную.    При прямой рекурсии процедура содержит

оператор обращения к самой себе: A-AПри косвенной рекурсии одна процедура

вызывает другую, которая сама либо посредством других процедур вызывает

исходную процедуру: A-B-AПри выполнении правильно организованного

рекурсивного блока осуществляется многократный последовательный переход

от некоторого текущего уровня организации алгоритма к нижнему уровню до

тех пор, пока не будет найдено условие, при котором рекурсия останавливается.

В этом случае процедура обращается к себе опосредованно, косвенно, путем

вызова другой процедуры, в которой содержится обращение к первой процедуре.

    При создании косвенной рекурсии возникает проблема: как описать вызываемую

процедуру. Как известно, в Паскале все переменные, константы, метки, процедуры

должны быть описаны до того, как будут упомянуты в операторах или выражениях,

в противном случае компилятор объявит их имена неизвестными. В косвенной

рекурсии процедура "А" вызывает процедуру "В", которая не описана. Выход из

ситуации в следующем: используется опережающее описание с помощью директивы

FORWARD. Эта директива объявляет только заголовок вызываемой процедуры,

заменяя собой тело процедуры, откладывая описание содержимого

(раздела операторов) на дальнейшее. Местоположение раздела операторов уже

не играет роли, и в нем можно не указывать формальные параметры, а

ограничиться лишь именем подпрограммы:

Оператор перехода. Пустой оператор

   В Паскале принят естественный порядок выполнения операторов, т.е. операторы

обычно выполняются в порядке их следования в тексте программы. Между тем

ОПЕРАТОР ПЕРЕХОДА позволяет задавать любой желаемый порядок выполнения

вычислений.Оператор перехода указывает, что далее программа должна выполняться

с места, помеченного указанной в операторе меткой. Оператор перехода имеет

вид: goto:метка; Любой оператор в программе может быть помечен, т.е. снабжен

меткой, которая предшествует оператору и отделяется от него двоеточием:

МЕТКА : ОПЕРАТОР ;    Метка может иметь произвольное имя, в качестве меток

также допускается использовать целые числа без знака. Используемая в программе

метка должна быть описана в блоке LABEL раздела описаний. Если в программе

несколько меток, то в блоке LABEL они приводятся в виде списка, отделяясь друг

от друга запятыми: LABEL 25, 0, Loop, 21, lab1;    Порядок перечисления меток в списке

безразличен. При использовании меток необходимо учитывать, что метки, описанные

в подпрограмме (процедуре, функции), локализуются в ней, поэтому переход извне

подпрограммы на метку внутри нее невозможен. Также невозможен переход из

подпрограммы на метку, расположенную в основном блоке программы. Следует помнить,

что частое использование оператора перехода ухудшает наглядность программы,

затрудняет ее понимание и отладку. Еще в марте 1968г. на эту тему была опубликована

историческая статья голландского программиста Эдсгера Дейкстри

"GOTO Statement Considered Harmful" ("о вреде оператора GOTO"). Использование

оператора перехода обосновано лишь в отдельных случаях, например для досрочного

выхода из цикла или перехода в конец программы для окончания ее работы

ПУСТОЙ ОПЕРАТОР не предписывает никаких действий, он представляет собой

пустую последовательность символов (т.е. отсутствие символов). Как и обычные

операторы, пустой оператор может быть помечен меткой. Пустой оператор отделяется

от других операторов точкой с запятой. Наиболее часто пустой оператор используется

для того, чтобы поместить в программе "точку", на которую должен осуществляться

переход по оператору перехода, но при этом не надо выполнять никаких

дополнительных действий; например, надо просто выйти из программы - для этого

ставим пустой оператор с меткой перед словом end:

Соседние файлы в папке Шпоры по информатике1