[Fortran] syntaxhighlighter_viewsource syntaxhighlighter_copycode
! NOTE:P209
!  A sample code that reveals the principle of recursive functions and the calculation process
      program ProgramName
      implicit none
      integer ExitKey
      integer(kind=4) :: n
      integer(kind=4), external :: fact
      write(unit=6, fmt="('N = ')") 
      read (unit=5, fmt=*) n
      write(unit=6, fmt="(I3,'! = ', I8)") n, fact(n)
! Avoid having the command window exit before the results are output
      write ( *, *) 'Press input any words to exit...'
      read ( *, *) ExitKey
      stop
      end program ProgramName
      recursive integer(kind=4) function fact(n) result(ans)
        implicit none
        integer(kind=4), intent(in) :: n
        integer(kind=4), save :: count = 1
        integer(kind=4) :: localcount, temp
        localcount = count 
        count = count + 1
        write(unit=6, fmt="(I2, 'th enter, n = ', I2)") localcount, n
        !  The IF-ELSE combination of multiple judgments only executes the first module that matches the condition
        !  and then jumps to END IF to leave the statement.
        if ( n < 0 ) then
          ans = -1
          write(unit=6, fmt="(I2, 'th exit, n = ', I2, 'ans = ', I8)") localcount, n, ans
          return
        else if ( n <=1 ) then
          ans = 1
          write(unit=6, fmt="(I2, 'th exit, n = ', I2, 'ans = ', I8)") localcount, n, ans
          return
        end if
        temp = n - 1
        ans = n * fact(temp)
        write(unit=6, fmt="(I2, 'th exit, n = ', I2, 'ans = ', I8)") localcount, n, ans
        return
      end function fact