Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лобораторні Pascal.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
530.94 Кб
Скачать

4. Функції.

Поряд із стандартними функціями, в мові можна визначити і інші необхідні програмі функції. Функція - це підпрограма, що визначає одне - єдине скалярне або засилкове значення, що використовується при обчисленні виразу. Описання функції має, по суті, такий самий вид, як і описання процедури. Різниця тільки у заголовку, який має вид:

Function < ім’я > : < тип результату > ;

або Function < ім’я > (<список описань формальних параметрів >): < тип результату >;

Синтаксична діаграма заголовка функції:

Заголовок

функції

Зверніть увагу на описання результату, який визначає тип значення функції.

Таким чином, для функції визначені всі ті поняття, які були сформульовані для процедур.

Ім’я, що задане в заголовку функції, іменує цю функцію. В середині описання функції - в розділі операторів - повинно бути присвоювання, що виконується, в лівій частині якого стоїть ім’я функції, а в правій - вираз що має тип значення функції.

Приклад опису функцій.

Функція IntPow підносить дійсне число x до степеня N. (Y = x N )

Function IntPow(x: Real; N: Integer) : Real;

Var i: Integer;

Begin

IntPow := 1;

For i:=1 to Abs(N) do IntPow := IntPow * x;

If N < 0 then IntPow := 1/IntPow

End;

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

Поняття локальних і глобальних об’єктів поширюються і на вкладені процедури. Наприклад, змінна, описана в процедурі А локальна по відношенню до основної програми і глобальна для процедур В і С, вкладених в А.

В деяких випадках необхідно з процедури здійснити виклик іншої процедури, описаної в тому ж розділі процедур і функцій. Наприклад, процедура С може містити оператор виклику процедури В. В цьому випадку компілятор правильно обробить текст програми, оскільки процедура В описана до процедури С. Якщо ж з процедури В необхідно звернутись до С, для правильної обробки виклику С необхідно використовувати механізм так званого попереднього описання С. Описання, що опереджає процедури (функції) - це її заголовок, услід за яким через “;” стоїть службове слово Forward. У тексті програми описання, що опереджає, повинно передувати процедурі, в якій процедура, що попередньо описана, викликається.

Якщо процедура або функція описані попередньо, описанню її тіла передує скорочений заголовок, що складається тільки з відповідного службового слова і імені - без списку описань параметрів.

5. Рекурсивно-визначені процедури і функції.

Описання процедури А, в розділі операторів якої використовується оператор цієї процедури, називається рекурсивним. Таким чином, рекурсивне описання має вид

Procedure A(u, v : ParType);

...

Begin

...; A(x, y); ...

End;

Аналогічно, описання функції F, в розділі операторів якої використовується виклик функції F, називається рекурсивним. Рекурсивне описання функції має вид

Function F(u, v : ArgType) : FunType;

...

Begin

...; z := g(F(x, y)); ...

End;

Використання рекурсивного описання процедури (функції) приводить до рекурсивного виконання цієї процедури (обчисленню цієї функції). Задачі, що формулюються природнім чином як рекурсивні, часто приводять до рекурсивних розв’язків.

Приклад 3. Факторіал.

Розглянемо рекурсивне визначення функції n!=1*2*...*n (n-факторіал). Нехай F(n) = n! Тоді

1.F(0) = 1

2.F(n) = n*F(n - 1) при n > 0

Засобами мови це визначення можна сформулювати як обчислення:

If n = 0

then F := 1

else F := F(n - 1) * n

Оформивши це обчислення як функцію і змінивши ім’я, отримаємо:

Function Fact(n: Integer): Integer;

Begin

If n = 0

then Fact := 1

else Fact := Fact(n - 1) * n

End;

Обчислення функції Fact можна представити як ланцюжок викликів нових копій цієї функції з передачею нових значень аргументу і повернень значень функції в попередню копію.

Ланцюжок викликів обривається при передачі нуля в нову копію функції. Рух у прямому напрямку (розгортання рекурсії) супроводжується тільки обчисленням умови і викликом. Значення функції обчислюється при згортанні ланцюжка викликів.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]