Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 错误:(1)处的符号不是伪变量_Recursion_Fortran - Fatal编程技术网

Recursion 错误:(1)处的符号不是伪变量

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

我试图编写一个代码,给出两个数字的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(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我会跟进的。我删除了我的答案,请使用just
integer::ans
并接受重复项。@VladimirF我使用了
integer::ans
,但仍然会给出错误OK,我重新打开我的答案并添加了这一方面。欢迎。使用人们跟随的标签是非常重要的。所有Fortran问题都使用tag。您可以为特定于版本的问题添加特定版本,但您的问题不是特定于版本的。谢谢您的反馈@VladimirF我会跟进的。我删除了我的答案,请使用just
integer::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