1.19.  РЕКУРСИВНЫЕ ПОДПРОГРАММЫ

Фортран 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-й степени квадратной матрицы размерности 44

 .

2) Модифицировать программу, так чтобы вычислялись 0-я, 1-я, 2-я, 3-я и 4-я степени заданной матрицы и печатались в отдельный файл.