Читайте также:
|
|
Возможно использовать как фактический параметр в вызове другой процедуры. Часто получается в результате вызова функции, которая использована как фактический параметр другой процедуры. Например:
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 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Объекты допустимого образа | | | Родовые подпрограммы |