Виклик процедури виклик процедури-підпрограми здійснюється окремим оператором такого вигляду

CALL ім'я підпрограми ([список фактичних параметрів])

Звернення до функції є операндом в вираженні. Воно може бути присутнім в правій частині оператора присвоювання. наприклад:

a = ім'я функції ([список фактичних параметрів])

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

Між формальними параметрами процедури в описі і фактичними параметрами при зверненні до неї повинні виконуватися правила відповідності:

- відповідність за кількістю (скільки формальних параметрів, стільки ж фактичних);

- відповідність по послідовності: перший фактичний параметр відповідає першому формальному, другий - другого і т.д.

- відповідність за типом: типи відповідних параметрів повинні збігатися.

Приклад 1. Програма обчислення довжин сторін трикутника, заданого координатами вершин, з використанням внутрішньої функції.

Program Treug1

r = S (x1, y1, x2, y2); print *, r! 1.414214

r = S (x1, y1, x3, y3); print *, r! 1.000000

r = S (x2, y2, x3, y3); print *, r! 1.000000

real function S (w1, z1, w2, z2)

end program flocal

Приклад 2. Програма обчислення довжин сторін трикутника, заданого координатами вершин, з використанням зовнішньої підпрограми.

Program Treug2

CALL S (x1, y1, x2, y2, r); print *, r! 1.414214

CALL S (x1, y1, x3, y3, r); print *, r! 1.000000

CALL S (x2, y2, x3, y3, r); print *, r! 1.000000

end program Treug2

subroutine S (w1, z1, w2, z2, L)

real w1, z1, w2, z2, L

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

Тут функція факторіал визначена через факторіал. Неважко зрозуміти справедливість такого визначення. Для n> 0

Варіант 0! = 1 є тривіальним. Але це опорное значення, від якого починається «розкручування» всіх наступних значень факторіала:

1! = 1 * 0! = 1 * 1 = 1; 2! = 2 * 1 = 2; 3! = 3 * 2! = 6 І т.д.

Розглянемо процедуру-функцію, яка використовує в своєму описі наведену вище рекурсивную формулу.

Recursive function ifact (n) result (fav)

Тип результату рекурсивної функції може бути заданий і наступними двома способами:

recursive integer function ifact (n) result (fav)

integer recursive function ifact (n) result (fav)

У рекурсивно певної функції обов'язково повинна використовуватися змінна для результату. В даному прикладі це змінна fav.

Основна програма, яка використовує зовнішню функцію ifact для обчислення величини K. має наступний вигляд:

Integer K, ifact

Print *, 'Введіть К'

Write (*, '(2X, I2, A, I6)') K, '! =', Ifact (K)

Нехай в основній програмі в цілу змінну До вводиться число 3. При обчисленні функції ifact з аргументом 3 відбудеться повторне звернення до функції ifact (2). Це звернення зажадає обчислення ifact (1). І нарешті, при обчисленні ifact (0) буде отриманий числовий результат 1. Потім ланцюжок обчислень розкрутиться в зворотному порядку:

ifact (1) = 1 * ifact (0) = 1,

ifact (2) = 2 * ifact (1) = 2,

ifact (3) = 3 * ifact (2) = 6.

Послідовність рекурсивних звернень до функції повинна обов'язково виходити на певне значення. А весь маршрут послідовних входжень машина запам'ятовує в спеціальній області пам'яті, званої стеком. Таким чином, виконання рекурсивної функції відбувається в два етапи: прямий хід - заповнення стека; зворотний хід - ланцюжок обчислень по зворотному маршруту, збереженому в стеці.

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

Очевидно, що такий варіант програми буде працювати швидше, ніж рекурсивний. І в тому випадку, коли важливо скорочення часу виконання програми, слід віддати перевагу останньому варіанту.