Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник.docx
Скачиваний:
46
Добавлен:
21.12.2018
Размер:
2.15 Mб
Скачать

Рекурсивные функции

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

procedure rever (n: integer);

begin

write (n mod 10);

if (n div 10) <> 0 then

rever (n div 10)

end;

begin

rever (3096);

readln

end.

В приведенном примере процедура rever выводит цифры, переданного ей в качестве фактического параметра числа, в обратном порядке. Т.е. если мы передаем число 35, то процедура выведет на экран число 53. Рассмотрим, как она это делает:

  1. Мы передаем число 3096.

  2. Процедура rever выводит на экран остаток от деления на 10. Это число 6.

  3. Переход на новую строку не происходит, т.к. используется write.

  4. Проверяется условие того, что 3096 при деление нацело на 10 больше нуля.

  5. Вызывается rever с фактическим параметром, равным 309.

  6. Вторая запущенная процедура выводит на экран цифру 9 и запускает третью процедуру с параметром 30.

  7. Третья процедура выводит 0 и вызывает четвертый rever с 3 в качестве параметра.

  8. Четвертая процедура выводит 3 на экран и ничего больше не вызывает, т.к. условие (3 div 10) <> 0 ложно.

  9. Четвертая процедура завершается и передает управление третьей.

  10. Третья процедура завершается и передает управление второй.

  11. Вторая процедура завершается и передает управление первой.

  12. Первая процедура завершается и передает управление в основную ветку программы.

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

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

3.Массивы в Pascal Общее представление о массивах

Переменные стандартного типа можно изобразить отдельными маленькими ячейками. То же самое относится и к переменным перечисляемого и интервального типов:

В данных ячейках могут содержаться любые значения из диапазона, определяемого их типами. Например, в ячейке month может быть любое одно значение от 1 до 12, а в ячейке x любое натуральное число в диапазоне примерно от -32000 до 32000.

Помимо этого, имеется также возможность объявлять переменные, которые являются массивами таких маленьких ячеек.

Ячейки массива можно назвать элементами; в квадратных скобках стоят индексы. Базовый тип массива – это тип элементов, из которых составлен массив (в каждом массиве все компоненты одного типа).

Элементы можно обрабатывать так же, как переменные базового типа:

...

nums[3] := 115.58;

read(nums[1]);

tbl[2,a] := true;

write(tbl[2,a]);

tbl[1,c] := not tbl[2,a];

...

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

Во фрагменте кода ниже записывается false во все элементы массива tbl и 0 во все элементы массива nums:

...

for n := 1 to 4 do

for ch := a to c do

tbl[n, ch] := false;

for i := 1 to 3 do

nums := 0;

...