!==================  Factorial  ======================================

module factorial_demo

 public :: factorial

 logical, save, public :: debug = .false.

contains

 recursive function factorial (n) result (r)

   integer, intent (in) :: n
   integer              :: r

    if ( debug ) then
       print *, "Entering factorial with n = ", n
    end if

    select case (n)
    case (:-1)
      print *, "Bad value for n ", n
      stop
    case (0, 1)
      r = 1
    case (2:)
      r = n*factorial(n-1)
    end select

    if (debug) then
      print *, "Leaving factorial for n= ", n, ", n! = ", r
    end if

 end function factorial

end module factorial_demo

program try_fact
 use factorial_demo

  integer           :: n, v
  character(len=1)  :: d

   outer: do

     print *, "Enter a number"
     read *, n
     print *, "Do you want to debug?"
     do  ! Look for Yes, No, or Quit
       read *, d
       select case (d)
       case ("Y", "y")
         debug = .true.
         exit
       case ("N", "n")
         debug = .false.
         exit
       case ("Q", "q")
         exit outer
       case default
         print *, "Enter `yes', `no' or `quit'!"
       end select
     end do
     v = factorial(n)
     print "(i5, a, i15)", n, "! = ", v

   end do outer

