Recursion 错误:(1)处的符号不是伪变量
我试图编写一个代码,给出两个数字的GCD:Recursion 错误:(1)处的符号不是伪变量,recursion,fortran,Recursion,Fortran,我试图编写一个代码,给出两个数字的GCD: program main implicit none integer::A,B,gcd,ans=0 read*,A,B gcd(A,B) write(*,*)'GCD of ',A,' and ',B,': ',ans end program main recursive function gcd(A,B) result(ans) implicit none integer,intent(i
program main
implicit none
integer::A,B,gcd,ans=0
read*,A,B
gcd(A,B)
write(*,*)'GCD of ',A,' and ',B,': ',ans
end program main
recursive function gcd(A,B) result(ans)
implicit none
integer,intent(in)::A,B
integer::ans
if (A==0) ans=B
if (B==0) ans=A
!base_case
if (A==B) ans=A
!recursive_case
if (A>B)then
ans=gcd(A-B,B)
else
ans=gcd(A,B-A)
end if
end function gcd
我的意见是:
98 56
我希望14
,但出现了以下错误:
source_file.f:5:4:
gcd(A,B)
1
Error: Unclassifiable statement at (1)
我不明白为什么会出现这个错误?如果有人解释我为什么会出错,我衷心感谢。您不能为结果变量指定
intent(out)
或任何其他intent或相关属性。看
仅使用
integer::ans
另外,刚刚
gcd(A,B)
不是在Fortran中使用函数的有效方法。使用
ans = gcd(A,B)
或
或类似的
请注意,主程序中声明的
ans
是一个与函数的结果变量无关的变量。即使名称相同,它们也是两个不同的东西。最好重命名其中一个,以明确说明问题。不能为结果变量指定intent(out)
或任何其他intent或相关属性。看
仅使用
integer::ans
另外,刚刚
gcd(A,B)
不是在Fortran中使用函数的有效方法。使用
ans = gcd(A,B)
或
或类似的
请注意,主程序中声明的
ans
是一个与函数的结果变量无关的变量。即使名称相同,它们也是两个不同的东西。最好将其中一个重命名以明确说明。欢迎。使用人们跟随的标签是非常重要的。所有Fortran问题都使用tag。您可以为特定于版本的问题添加特定版本,但您的问题不是特定于版本的。谢谢您的反馈@VladimirF我会跟进的。我删除了我的答案,请使用justinteger::ans
并接受重复项。@VladimirF我使用了integer::ans
,但仍然会给出错误OK,我重新打开我的答案并添加了这一方面。欢迎。使用人们跟随的标签是非常重要的。所有Fortran问题都使用tag。您可以为特定于版本的问题添加特定版本,但您的问题不是特定于版本的。谢谢您的反馈@VladimirF我会跟进的。我删除了我的答案,请使用justinteger::ans
并接受重复项。@VladimirF我使用了integer::ans
,但仍然会给出错误OK,我重新打开我的答案并添加了这一方面。我应用了你的答案,但得到了另一个错误@VladimirF@NajmunNahar这是一些不同的错误。这一次是运行时错误。现在可能是提出新问题的时候了。启用编译器中的所有调试选项。使用gfortran-g-Wall-fcheck=all
。检查所有的if分支。你不是在某个地方有无限递归吗?用一个新问题来说明这一点。你不应该对不起,我没有安装gfortran。我使用一个在线编译器来运行这个代码Ok我删除了if(A==0)
和if(B==0)
分支occur@NajmunNahar您不能仅仅删除这些分支,您应该仔细检查并了解正在发生的事情。在函数内打印A和B以查看问题所在。几乎可以肯定,您有一些无限递归。我确实认为应该用一个新问题来提问。不要只是改变这个标题。你不能在同一个问题上反复问新问题。您应该已经接受了重复链接并提出了一个新问题。您确实需要一个适当的编译器来进行适当的调试。请注意,您的函数中必须有更多的else
和else if
。我应用了您的答案,但得到了另一个错误@VladimirF@NajmunNahar这是一些不同的错误。这一次是运行时错误。现在可能是提出新问题的时候了。启用编译器中的所有调试选项。使用gfortran-g-Wall-fcheck=all
。检查所有的if分支。你不是在某个地方有无限递归吗?用一个新问题来说明这一点。你不应该对不起,我没有安装gfortran。我使用一个在线编译器来运行这个代码Ok我删除了if(A==0)
和if(B==0)
分支occur@NajmunNahar您不能仅仅删除这些分支,您应该仔细检查并了解正在发生的事情。在函数内打印A和B以查看问题所在。几乎可以肯定,您有一些无限递归。我确实认为应该用一个新问题来提问。不要只是改变这个标题。你不能在同一个问题上反复问新问题。您应该已经接受了重复链接并提出了一个新问题。您确实需要一个适当的编译器来进行适当的调试。请注意,函数中必须有更多的else
和else if
。