next up previous contents
Nächste Seite: INTERFACE-Blöcke Aufwärts: Unterprogramme Vorherige Seite: SUBROUTINE   Inhalt

Rekursive Unterprogramme

Im Gegensatz zu FORTRAN 77 ist es in Fortran 90 auch möglich, (indirekt) rekursive Unterprogramme zu schreiben:
Es ist also möglich, daß sich Unterprogramme gegenseitig aufrufen (indirekte Rekursion), aber auch, daß sich ein Unterprogramm selbst wieder aufruft.
Rekursive Unterprogramme (sowohl "echt" als auch indirekt rekursive) müssen mit RECURSIVE gekennzeichnet sein und im Falle rekursiver Funktionen ist unbedingt eine RESULT-Variable anzugeben (da der Funktionsname sonst auf beiden Seiten eines "=" stehen könnte).
 
PROGRAM indirekte_Rekursion
  IMPLICIT NONE
  INTEGER :: i
  LOGICAL :: gerade

  WRITE (*,"(A)",ADVANCE="NO") "Geben Sie bitte eine Integerzahl ein: "
  READ (*,*) i
  IF (gerade(ABS(i))) THEN
    WRITE (*,*) i, 'ist eine gerade Zahl'
  ELSE
    WRITE (*,*) i, 'ist eine ungerade Zahl'
  ENDIF
END PROGRAM

RECURSIVE FUNCTION gerade (i) RESULT (ergebnis)
  IMPLICIT NONE
  INTEGER :: i
  LOGICAL :: ergebnis, ungerade

  IF (i == 0) THEN
    ergebnis = .TRUE.
  ELSE
    ergebnis = ungerade(i-1)
  ENDIF
END FUNCTION gerade

RECURSIVE FUNCTION ungerade (i) RESULT (ergebnis)
  IMPLICIT NONE
  INTEGER :: i
  LOGICAL :: ergebnis, gerade

  IF (i == 0) THEN
    ergebnis = .FALSE.
  ELSE
    ergebnis = gerade(i-1)
  ENDIF
END FUNCTION ungerade

Mit rekursiven Funktionen ist es möglich, den Source-Code von Programmen oft sehr kurz oder leicht verständlich zu schreiben:

PROGRAM fakultaet
 IMPLICIT NONE
 INTEGER :: n
 ....
 WRITE (*,*) 'n! = ',faculty(n)

CONTAINS
 RECURSIVE INTEGER FUNCTION faculty (n) RESULT (fac)
  IMPLICIT NONE
  INTEGER  :: n
  IF (n <= 1) THEN
   fac = 1                      ! Abbruch der Rekursion bei definiertem
  ELSE                          ! Wert (oft bei n=0 oder 1)
   fac = n*faculty(n-1)         ! n! = n*(n-1)! .. Rekursionsformel wird
  ENDIF                         ! nahezu 1:1 umgesetzt!
 END FUNCTION faculty
END PROGRAM fakultaet



Reinfried O. Peter 2001-09-07