Recursion 递归函数中的运行时检查失败
当我使用运行时检查编译程序时,会出现以下错误(我不知道为什么): 代码是:Recursion 递归函数中的运行时检查失败,recursion,fortran,runtime,intel-fortran,Recursion,Fortran,Runtime,Intel Fortran,当我使用运行时检查编译程序时,会出现以下错误(我不知道为什么): 代码是: program test implicit none real(8) :: x x=my_sum(lambda_i,0,200) print*,x contains function lambda_i(n) result(i) real(8) :: i integer,intent(in) :: n i=dble(n) end functio
program test
implicit none
real(8) :: x
x=my_sum(lambda_i,0,200)
print*,x
contains
function lambda_i(n) result(i)
real(8) :: i
integer,intent(in) :: n
i=dble(n)
end function
recursive function my_sum(f,i,n) result(s)
implicit none
real(8) :: s
integer, intent(in) :: i,n
interface
function f(n)
implicit none
real(8) :: f
integer,intent(in) :: n
end function
end interface
if ( n .ge. 0 ) s=f(n)+my_sum(f,i,n-1)
end function
end program
有人有主意吗?没有检查,程序运行正常,除非达到递归限制。我认为问题在于
if ( n .ge. 0 ) s=f(n)+my_sum(f,i,n-1)
一旦你到达n.lt。0
,返回值s
未定义,函数返回未定义的变量(正如ifort
所抱怨的那样)。因为这是递归的最后一步,所有其他结果都依赖于此,所以总结果是未定义的
这可以通过使用
if ( n .ge. 0 ) then
s=f(n)+my_sum(f,i,n-1)
else
s=0._8
endif
我想问题是
if ( n .ge. 0 ) s=f(n)+my_sum(f,i,n-1)
一旦你到达n.lt。0
,返回值s
未定义,函数返回未定义的变量(正如ifort
所抱怨的那样)。因为这是递归的最后一步,所有其他结果都依赖于此,所以总结果是未定义的
这可以通过使用
if ( n .ge. 0 ) then
s=f(n)+my_sum(f,i,n-1)
else
s=0._8
endif
我的iPort生成值20100,不会崩溃(Windows上的版本14)。Gfortran给出了相同的值,Abosft 2014无法编译(因为它需要lambda_i声明的外部函数,即使它是一个内部函数)。如果我“外部化”lambda_I,我仍然得到20100。我的ifort生成值20100,不会崩溃(Windows上的版本14)。Gfortran给出了相同的值,Abosft 2014无法编译(因为它需要lambda_i声明的外部函数,即使它是一个内部函数)。如果我“外部化”lambda_I,我仍然得到20100。当然,你是对的,但有趣的是,你在三个编译器中得到相同的值。这也是在建议的else子句中设置s=0时得到的值。也就是说,它们似乎都初始化为零。当然,您是对的,但有趣的是,您在三个编译器中得到相同的值。这也是在建议的else子句中设置s=0时得到的值。也就是说,它们似乎都初始化为零。