Фортран 90 поддерживает рекурсивные вызовы внешних, модульных и внутренних подпрограмм. Подпрограмма называется рекурсивной, если она обращается сама к себе или вызывает другую процедуру, которая, в свою очередь, вызывает первую. В первом случае рекурсия называется прямой во втором – косвенной. Заголовок объявления рекурсивной подпрограммы начинается служебным словом RECURSIVE.
ПРИМЕР: Рекурсивная подпрограмма вычисления степени матрицы.
SUBROUTINE ED(N,C)
! Подпрограмма, задающая единичную матрицу
INTEGER I, N
REAL(8) C(N,N)
C=0.0
DO I=1, N
C(I,I)=1.0
END DO
END SUBROUTINE ! END ED
! Рекурсивная процедура вычисления степени матрицы
RECURSIVE SUBROUTINE AT_MATR(A,N,K,SA)
INTEGER N, K
REAL (8) A(N,N), SA(N,N), B(N,N)
! Любая ненулевая матрица в нулевой степени есть единичная
IF (K.EQ.0) THEN
CALL ED(N,SA)
END IF
! Матрица в первой степени равна самой себе
IF (K.EQ.1) THEN
SA=A
END IF
! Если степень больше единицы происходит рекурсивное обращение к AT_MATR
IF (K> 1) THEN
CALL AT_MATR(A,N,K-1,B)
! Процедура перемножения двух матриц MULTIPLY приведена в предыдущем примере
CALL MULTIPLY(N,B,A,SA)
END IF
RETURN
END SUBROUTINE ! AT_MATR
PROGRAM PROG_RECURSIVE
REAL(8), ALLOCATABLE, DIMENSION(:,:) ::A,A4,E,A1
INTEGER I, J, K, N
REAL(8) D
OPEN(30,FILE='RECURS.TXT')
READ(30,*) N
ALLOCATE(A(N,N))
ALLOCATE(A4(N,N))
ALLOCATE(A1(N,N))
ALLOCATE(E(N,N))
READ(30,*) ((A(I,J),J=1,N),I=1,N)
CALL AT_MATR(A,N,0,E)
CALL AT_MATR(A,N,1,A1)
CALL AT_MATR(A,N,4,A4)
WRITE(30,*) ' MATRIX A'
WRITE(30,'(/(<N>F10.4))')((A(I,J),J=1,N),I=1,N)
WRITE(30,*) ' MATRIX A1'
WRITE(30,'(/(<N>F10.4))')((A1(I,J),J=1,N),I=1,N)
WRITE(30,'(/)')
WRITE(30,*) ' MATRIX E'
WRITE(30,'(/(<N>F10.4))')((E(I,J),J=1,N),I=1,N)
WRITE(30,'(/)')
WRITE(30,*) ' MATRIX A4'
WRITE(30,'(/(<N>F10.4))')((A4(I,J),J=1,N),I=1,N)
DEALLOCATE(A)
DEALLOCATE(A4)
DEALLOCATE(A1)
DEALLOCATE(E)
CLOSE(30)
STOP
END
В программе PROG_RECURSIVE матрица A возводится в нулевую(E), первую(A1) и четвертую степень (A4) с помощью обращения к процедуре AT_MATR.
ЗАДАНИЕ:
1) Скачать программу и применить
для вычисления 4-й степени квадратной матрицы размерности 4
4
.
2) Модифицировать программу, так чтобы вычислялись 0-я, 1-я, 2-я, 3-я и 4-я степени заданной матрицы и печатались в отдельный файл.