- •Конспект лекций
- •1.4 Общая структура программы
- •1.5 Стандартные процедуры и функции
- •1.6 Процедуры ввода/вывода
- •2. Простые типы данных
- •2.1 Целые типы
- •2.2 Вещественные типы
- •2.3 Cимвольный тип данных
- •2.4 Логический тип данных.
- •2.5 Ограниченные типы
- •2.6 Перечислимые типы
- •2.7 Описание типов
- •2.8 Преобразование типов
- •2.9 Порядок вычисления выражений
- •3. Операторы языка Паскаль
- •3.1 Оператор присваивания
- •3.2 Составной оператор
- •3.3 Условный оператор
- •3.4 Оператор выбора case
- •3.5 Оператор цикла с параметром (цикл for)
- •3.6 Оператор цикла с предусловием (цикл while)
- •1 Вариант:
- •2 Вариант:
- •3 Вариант:
- •3.7 Оператор цикла с постусловием (цикл repeat)
- •3.8 Вложенные циклы
- •3.9 Оператор перехода goto
- •4. Массивы
- •4.2 Сортировка элементов массива
- •4.3 Многомерные массивы
- •5. Подпрограммы (процедуры и функции)
- •5.1 Процедуры
- •5.2 Функции
- •5.3 Области действия имен
- •5.4 Параметры процедур и функций
- •5.5 Побочные эффекты при использовании подпрограмм
- •5.6 Передача массивов в подпрограммы
- •5.7 Параметры-костанты
- •5.8 Массивы открытого типа
- •5.9 Рекурсия в подпрограммах
- •6. Строковый тип данных
- •6.1 Описание строк
- •6.2 Операции со строками
- •6.3 Процедуры и функции для работы со строками
- •7. Стандартные модули Турбо-Паскаля
- •7.1 Модули турбо3 и graph3
- •7.2 Модуль overlay
- •7.3 Модуль dos
- •7.4 Модуль system
- •7.5 Модуль printer
- •7.6 Модуль crt
- •7.7 Модуль graph
- •8. Записи
- •8.1 Определение записи
- •8.2 Оператор над записями
- •8.3 Вложенные записи
- •8.4 Массив записей
- •8.5 Записи с вариантами
- •9. Файлы
- •9.1 Определение файла
- •9.2 Процедуры и функции для работы с файлами
- •9.3 Нетипизированные файлы
- •10. Интегрированная среда Турбо Паскаля
- •10.1 Как начать работу с Турбо Паскалем
- •10.2 Ваша первая программа
5.9 Рекурсия в подпрограммах
В теле подпрограммы доступны все объекты, описанные в основной программе, в том числе и имя самой подпрограммы. Таким образом, внутри тела подпрограммы возможен вызов самой подпрограммы. Процедуры и функции, использующие вызовы «самих себя», называются рекурсивными.
Многие математические алгоритмы имеют рекурсивную природу, поэтому рекурсия широко используется в программировании. В качестве примера приведем известный алгоритм вычисления факториала неотрицательного целого числа:
(0!=1)
1!=1
N!=1*2*3*…*(N-1)*N
алгоритм основан на соотношении N!=(N-1)!*N
Пример:
function fact(N: word): longint;
begin
if (n=0) or (n=1) then fact:=1
else fact:=n*fact(n-1);
end;
При каждом новом обращении к подпрограмме параметры, которые она использует, заносятся в стек, причем параметры предыдущего обращения тоже сохраняются.
Рекурсивное оформление программы более компактно и эффективно, но не следует забывать об опасности переполнения стека (!).
Схема вызовов при вычислении 5!:
fact(5); 1*2*3*4*5
fact(4); 1*2*3*4
fact(3); 1*2*3
fact(2); 1*2
fact(1); 1
Задачи для самоконтроля
5.1 Определите значение переменных a, b после выполнения следующих программ:
а) var a,b: integer; procedure proc(x: integer; y: integer); begin y:= y+2; x:= x+2;
~ begin a:=15; b:=15; proc(a,b); writeln(‘a = ’,a,’ b= ‘,b); end.
|
б) var a,b: integer; procedure proc(x: integer; var y: integer); begin y:= y+2; x:= x+2;
~ begin a:=15; b:=15; proc(a,b); writeln(‘a = ’,a,’ b= ‘,b); end. |
в) var a,b: integer; procedure proc(var x: integer; y: integer); begin y:= y+2; x:= x+2;
~ begin a:=15; b:=15; proc(a,b); writeln(‘a = ’,a,’ b= ‘,b); end. |
г) var a,b: integer; procedure proc(x: integer; var y: integer); begin y:= y+2; x:= x+2;
~ begin a:=15; b:=15; proc(a,b); writeln(‘a = ’,a,’ b= ‘,b); end. |
6. Строковый тип данных
6.1 Описание строк
Строка – это последовательность символов произвольной длины (до 255 символов). Строку можно рассматривать, как массив символов переменной длины. Максимальное количество символов в строке указывается при ее описании в квадратных скобках:
var str1: string[80];
str2: string;
Если в квадратных скобках не указан максимальный размер строки, то он считается равным 255.
Строка может быть описана как типизированная константа:
const str10: string[10]=’январь’;
В памяти для строки длины N отводится N+1 байт, пронумерованных от 0 до N. В нулевом байте хранится текущее значение длины строки.
0 1 2 3 4 5 6 … 10
6 |
я |
н |
в |
а |
р |
ь |
|
|
|
Когда изменяется содержание строки, автоматически пересчитывается ее текущая длина и меняется значение 0-го байта. Всегда можно определить текущую длину строки:
l:=ord(str10[0]);
writeln(l);
Допустимо обращение к отдельным символам строки:
var s: string;
begin
s:=’стол’;
writeln(s); стол
s[3]:=’у’;
writeln(s); стул
end.