Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование 2 семестр 1 курс.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
523.82 Кб
Скачать

Опережающее описание подпрограмм .

Так как текст программ транслируется в выполнимый код последовательно с верху в низ (в визуальном восприятии пользователя) , то типизированные – переменные , константы , подпрограммы должны описываться до того , как будут использоваться . В противном случае компилятор считается не определенным имя неизвестным и приходится перемещаться вверх по тексту , объявляя неизвестные компилятору данные . Однако в случае с подпрограммами этого можно избежать , используя опережающее описание подпрограмм применяя директиву Forward .

Синтаксис описания

Procedure P1 ; Forward;

Function f1 (x:byte ):char ; Forward;

……

Procedure p1 ;

Begin

……

End;

Function f1 ;

Begin

……..

End;

Указание директивы Forward говорит о том , что описание процедур или функций откладывается на потом , при чем при описании реализации функций или процедур , определяется ранее с директивой Forward ; списанные параметры можно не указывать . Очень часто директива Forward ; используется в случае взаимных обращений подпрограмм друг к другу

Пример

Procedure P1 (y:type x y );forward;

Procedure P2 (x: type x y );

Begin

P1 (p);

.

End;

Procedure P1;

Begin

P2(q);

.

End;

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

Рекурсивные подпрограммы

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

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

Пример подсчета факториала

1, n=0

N!=

N*(n-1)!, >0

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

Var

M:longint ;

Function factorial (n :word ): longint ;

Begin

If n=0 then factorial :=1

Else Factorial :=n * Factorial (n-1 );

End;

Begin

M:=factorial (4);

End.

Работа данной функции : при вызове функции Factorial(4) в стек поступает копия параметра n elau n=0 , то вызывает эта же функция с параметром n-1

Значение параметра , который так же сохраняется в стеке . Такие последовательные сохранения значений параметров будут происходить до тех пор пака выражение определяющее функцию не будет полностью определенно . Таким образом в стеке будет храниться столько параметров , сколько рекурсий произошло до момента определения выражения . После определения выражения (при n=0 ) алгоритм начинает разворачиваться в обратную сторону изымаю из памяти отложенные в ней значения параметров . Поскольку при этом на каждом очередном шаге все элементы выражений будут известны , то через n обратных шагов будет получен конечный результат .

Для работы способности рекурсивных подпрограмм необходимым условием является наличие условия окончания рекурсии вызовов . Если они отсутствуют или не выполняются , то глубина рекурсии будет бесконечна , что приведет переполнению стека практически завершается фатальной ошибкой . Не смотрю на то , что рекурсии подпрограмм наглядно отражают алгоритм , они приводят к большому расходу памяти . В настающее время очень часто вместо использования рекурсивных программ эффективно используются итерационные методы решения задач , не требующей лишней памяти при сопоставимой скорости вычисления .

Лекция №6

Подпрограммы. Внешние подпрограммы. Подпрограммы в качестве параметров подпрограмм. Примеры.