Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Процедуры в качестве параметров

Массивы и производные типы | Оператор и конструкция IF | Конструкция SELECT CASE | Упорядочение операторов | Уровни доступа | Спецификация входных-выходных параметров | Использование модуля | Внутренние процедуры | Связь с хозяином (Host) - глобальные данные | Вещественные - форма с фиксированной точкой |


Читайте также:
  1. Do в качестве общей идеи
  2. II. Порядок выплаты ежемесячной компенсации на оплату проезда до места проведения процедуры гемодиализа инвалидам, находящимся на постоянном диализном лечении.
  3. Административные процедуры как форма реализации компетенции органов внутренних дел.
  4. Административные регламенты как акты управления, устанавливающие административные процедуры.
  5. Бракераж некачественной продукции.
  6. В качестве движка нтернет-магазина выбираем платный набор скриптов WebAsyst Shop-Script.
  7. В качестве меры корреляции вычисляется фи-коэффициент.

 

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

 

PROGRAM test

INTERFACE

REAL FUNCTION func(x)

REAL, INTENT(IN)::x

END FUNCTION func

END INTERFACE

...

CALL sub1(a, b, func(2))

...

END PROGRAM test

REAL FUNCTION func(x)! внешняя

REAL, INTENT(IN):: x

func = 1/x

END FUNCTION func

 

Когда вызов sub1 сделан с тремя параметрами a, b и результат функции func(2) - в этом случае возвращаемое значение 1/2. Процедура, которая использована как параметр будет всегда выполняться прежде, чем процедура, в которой оператор вызова появиться. Использование процедуры в качестве параметра требует явного интерфейса.

 

Заметим, что оператор спецификации для функции func идентифицирует результат типа REAL. Это альтернатива объявлению имени функции как переменной:

 

REAL FUNCTION func(x)

REAL, INTENT(IN):: x

func = 1/x

END FUNCTION func

 

и

 

FUNCTION func(x)

REAL:: func

REAL, INTENT(IN):: x

func = 1/x

END FUNCTION func

 

эквивалентны.

Я

Рекурсия

 

Fortran 90 допускает рекурсивные подпрограммы (подпрограммы, которые вызывают сами себя). В целях оптимизации рекурсивная подпрограмма должна быть специфицирована ключевым словом RECURSIVE.

Объявление рекурсивной функции имеет отличие в синтаксисе. Должно быть использовано ключевое слово RESULT, специфицирующее имя переменной, хранящей значение результата функции (Ключевое слово RESULT необходимо, чтобы использовать имя функции для возвращения результата. Массив значений рекурсивной функции допустим и в то же время ссылка на рекурсивную функцию будет неразличима от ссылки на массив. Имя функции неявно имеет тот же атрибут, что и имя результата.)

Очевидно, что что рекурсия должна быть объявлена в заголовке:

 

INTEGER RECURSIVE FUNCTION fact(N) RESULT(N_Fact)

или

RECURSIVE INTEGER FUNCTION fact(N) RESULT(N_Fact)

(Целыми INTEGER будут и fact и N_Fact.)

 

или,

RECURSIVE FUNCTION fact(N) RESULT(N_Fact)

INTEGER N_Fact

 

В последнем случае INTEGER N_Fact дает тип величине fact; фактически специфицирует тип fact.

 

Рекурсия может одного из двух типов:

•Непрямая рекурсия - A вызывает B вызывает A...

•Прямая рекурсия - A вызывает A вызывает A...

обе требуют атрибута RECURSIVE для процедуры A.

Рекурсивные процедуры требуют осторожного управления. Важно обеспечить ограничения самовызова процедуры. Например, рекурсивная процедура factorial, приведенная выше, использует конструкцию IF, чтобы вызвать себя снова или возвратить зафиксированный результат. Потому здесь есть ограничение на количество вызовов процедуры.

Пример рекурсивной функции

 

RECURSIVE FUNCTION fact(n) RESULT(N_Fact)

INTEGER, INTENT(IN):: n

INTEGER:: N_Fact

IF(n==1) THEN

N_Fact = 1

ELSE

N_Fact = n*fact(n-1)

END IF

END FUNCTION fact

 

Подпрограммы объявляются с помощью заголовка RECURSIVE SUBROUTINE.

 

Пример рекурсивной подпрограммы

 

RECURSIVE SUBROUTINE Factorial(N, Result)

INTEGER, INTENT(IN):: N

INTEGER, INTENT(INOUT):: Result

IF (N > 0) THEN

CALL Factorial(N-1,Result)

Result = Result * N

ELSE

Result = 1

END IF

END SUBROUTINE Factorial


Дата добавления: 2015-11-14; просмотров: 45 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Объекты допустимого образа| Родовые подпрограммы

mybiblioteka.su - 2015-2024 год. (0.006 сек.)