Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- recursive function facHelper(n, acc) result(returner)
- integer::n
- integer::acc
- integer::returner
- if (n <= 1) then
- returner = acc
- else
- returner = facHelper(n - 1, n * acc)
- endif
- end function facHelper
- function factorial(n)
- integer::n
- integer::factorial
- factorial = facHelper(n, 1)
- end function factorial
- Error: Return type mismatch of function 'fachelper' at (1) (REAL(4)/INTEGER(4))
- Error: Return type mismatch of function 'factorial' at (1) (REAL(4)/INTEGER(4))
- Error: Return type mismatch of function 'fachelper' at (1) (REAL(4)/INTEGER(4))
- Error: Return type mismatch of function 'factorial' at (1) (REAL(4)/INTEGER(4))
- program test
- implicit none
- integer :: i
- do i=1,10
- write (*,'(i2,"! = ",i8)') i, factorial(i)
- end do
- contains
- [cut and paste the code from your question]
- end program
- gfortran -std=f95 -o fac fac.f90
- 1! = 1
- 2! = 2
- 3! = 6
- 4! = 24
- 5! = 120
- 6! = 720
- 7! = 5040
- 8! = 40320
- 9! = 362880
- 10! = 3628800
- program test
- implicit none
- integer :: i
- interface
- function factorial(n)
- integer, intent(in) :: n
- integer :: factorial
- end function factorial
- end interface
- do i=1,10
- write (*,'(i2,"! = ",i8)') i, factorial(i)
- end do
- end program
- recursive function facHelper(n, acc) result(returner)
- implicit none
- integer, intent(in) :: n, acc
- integer :: returner
- if (n <= 1) then
- returner = acc
- else
- returner = facHelper(n - 1, n * acc)
- endif
- end function facHelper
- function factorial(n)
- implicit none
- integer, intent(in) :: n
- integer :: factorial
- interface
- function facHelper(n,acc)
- integer, intent(in) :: n, acc
- integer :: facHelper
- end function
- end interface
- factorial = facHelper(n, 1)
- end function factorial
- module fact
- private :: facHelper
- contains
- recursive function facHelper(n, acc) result(returner)
- implicit none
- integer, intent(in) :: n, acc
- integer :: returner
- if (n <= 1) then
- returner = acc
- else
- returner = facHelper(n - 1, n * acc)
- endif
- end function facHelper
- function factorial(n)
- implicit none
- integer, intent(in) :: n
- integer :: factorial
- factorial = facHelper(n, 1)
- end function factorial
- end module fact
- program test
- use fact
- implicit none
- integer :: i
- do i=1,10
- write (*,'(i2,"! = ",i8)') i, factorial(i)
- end do
- end program
- recursive integer function facHelper(n, acc) result(returner)
- function factorial(n)
- integer::n
- integer::factorial
- integer::facHelper ! <-- Missing information now available
- factorial = facHelper(n, 1)
- end function factorial
- recursive function facHelper(n, acc) result(returner)
- integer::n
- integer::acc
- integer::returner
- if (n <= 1) then
- returner = acc
- else
- returner = facHelper(n - 1, n * acc)
- endif
- end function facHelper
- function factorial(n)
- integer::n
- integer::factorial
- integer::facHelper
- factorial = facHelper(n, 1)
- end function factorial
- recursive integer function facHelper(n, acc) result(returner)
- integer::n
- integer::acc
- if (n <= 1) then
- returner = acc
- else
- returner = facHelper(n - 1, n * acc)
- endif
- end function facHelper
- integer function factorial(n)
- integer::n
- integer::facHelper
- factorial = facHelper(n, 1)
- end function factorial
- gfortran --std=f95 -c ./fac.f95
- recursive function tailFacHelper(n, acc) result(returner)
- integer (kind=8)::n
- integer (kind=8)::acc
- integer (kind=8)::returner
- if (n <= 1) then
- returner = acc
- else
- returner = tailFacHelper(n - 1, n * acc)
- endif
- end function tailFacHelper
- function tailFac(n)
- integer (kind=8)::n
- integer (kind=8)::tailFac
- integer (kind=8)::tailFacHelper
- tailFac = tailFacHelper(n, 1_8)
- end function tailFac
- recursive function vanillaFac(n) result(returner)
- integer (kind=8)::n
- integer (kind=8)::returner
- if (n <= 1) then
- returner = 1
- else
- returner = n * vanillaFac(n - 1)
- endif
- end function vanillaFac
- f2py --overwrite-signature --no-lower fac.f95 -m liboptfac -h fac.pyf;
- f2py -c --f90flags=--std=f95 --opt=-O3 fac.pyf fac.f95;
- f2py --overwrite-signature --no-lower fac.f95 -m libnooptfac -h fac.pyf;
- f2py -c --f90flags=--std=f95 --noopt fac.pyf fac.f95;
- python timer.py
- *****Fortran (optimizations level 03 enabled)*****
- liboptfac.vanillaFac(20)
- 1000000 calls
- Best of ten: 0.813575983047
- liboptfac.tailFac(20)
- 1000000 calls
- Best of ten: 0.843787193298
- liboptfac.tailFacHelper(20, 1)
- 1000000 calls
- Best of ten: 0.858899831772
- *****Fortran (no optimizations enabled)*****
- libnooptfac.vanillaFac(20)
- 1000000 calls
- Best of ten: 1.00723600388
- libnooptfac.tailFac(20)
- 1000000 calls
- Best of ten: 0.975327014923
- libnooptfac.tailFacHelper(20, 1)
- 1000000 calls
- Best of ten: 0.982407093048
- *****Python*****
- py_vanilla_fac(20)
- 1000000 calls
- Best of ten: 6.47849297523
- py_tail_fac(20)
- 1000000 calls
- Best of ten: 6.93045401573
- py_tail_fac_helper(20, 1)
- 1000000 calls
- Best of ten: 6.81205391884
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement