Рекурсия и опережающее описание

Статическое и динамическое выделение памяти переменным

В стандартном Паскале глобальным переменным память выделяется статически. Это значит, что для каждой переменной выделяется необходимое количество ячеек памяти (байтов) на все время работы программы.

Локальным переменным память выделяется динамически – на время работы процедуры или функции, в которой такая переменная объявлена. При этом локальные переменные размещаются в стеке.

Стек – это такой тип организации памяти, при котором последний элемент, загруженный в стек, извлекается в первую очередь. Соответственно, первый загруженный элемент извлекается из памяти последним. Поэтому стек называют также очередью LIFO (Last In, First Out). Доступ к стеку осуществляется через "верхушку стека".

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

В некоторых языках, например, в Си, режимом выделения памяти переменным можно управлять. В стандартном Паскале это не предусмотрено. Поэтому если процедуре или функции нужны статические переменные (например, для хранения каких-то данных от одного вызова до другого), их следует объявлять в блоке программы. Однако нужно аккуратно использовать статические данные. Поскольку они доступны как в самой программе, так и во всех процедурах и функциях, можно сделать ошибку, которую затем будет трудно обнаружить.

В программировании широко применяются итеративные алгоритмы на основе циклов. Например, вычисление факториала (n!) можно определить итеративно следующим образом:

n! = 1´2´3´ … ´ n, или .

Соответствующая функция, реализующая этот алгоритм, может выглядеть так:

Function Factorial(n:Integer):Integer;

Var i,f:Integer;