program determinante
  ! Calcola il determinante di una matrice test con il metodo di Laplace
  implicit none
  
  real(8), allocatable, dimension(:,:) :: a
  real(8) :: d,det
  integer :: n,i,j
  
  write(*,'(a)',advance='no') "Inserisci la dimensione della matrice "
  read (*,*) n
  allocate(a(n,n))

  ! Inizializza la matrice
  a=0.d0
  do i=1,n
     do j=1,n
        if (i==j) a(i,j)=2.d0
        if (abs(i-j)==1) a(i,j)=1.d0
     end do
  end do

  ! Calcola il determinante
  d=det(n,a)
  write(*,*) "Il determinante e` ",d

end program determinante

recursive function det(n,a) result(risultato)
  implicit none

  integer :: n,i
  real(8), dimension(n,n)     :: a
  real(8), dimension(n-1,n-1) :: b
  real(8) :: s,risultato
  
  if (n==1) then
     s=a(1,1)
  else
     s=0.d0
     do i=1,n
        b(1:n-1,1:i-1)=a(2:n,1:i-1)
        b(1:n-1,i:n-1)=a(2:n,i+1:n)
        s=s+(-1)**(i+1)*a(1,i)*det(n-1,b)
     end do
  end if
  risultato=s

end function det
