PROGRAM Fattoriale
!-------------------------------------------------------------------------
! Calcolo del fattoriale di un intero.
!-------------------------------------------------------------------------
  IMPLICIT NONE
  INTEGER:: N
  WRITE(*,*) "Dammi un intero non negativo"
  READ(*,*) N
  WRITE(*,*) "Il fattoriale e':", Fatt(N)
  STOP

CONTAINS
!-------------------------------------------------------------------------
RECURSIVE FUNCTION Fatt(N)  RESULT(N_fatt)
! Nota la distinzione fra il nome della funzione ed il nome del risultato
! all'interno della funzione.
!-------------------------------------------------------------------------
  INTEGER,INTENT(IN):: N
  INTEGER           :: N_fatt   ! Il tipo va dichiarato per il risultato
  SELECT CASE (N)
    CASE (:-1)
      STOP 'ERRORE: Funzione Fatt, argomento negativo'
!       E' possibile scrivere un messaggio di errore
    CASE (0)
      N_fatt = 1
    CASE (1:)
      N_fatt = N*Fatt(N-1)
  END SELECT
  RETURN
END FUNCTION Fatt
END PROGRAM Fattoriale
