Fortran 90之前,Fortran如何防止递归?

4

我一直在阅读一些关于编程语言的文章,看到在Fortran 90之前是不允许递归的。那么如何避免间接递归呢?

我知道在函数本身体内进行直接递归可以轻松检测,但是在一般情况下这个问题似乎更加棘手。


5
这句话的意思是它不需要工作,也不需要被检测到。 - user207421
1
我明白了,所以如果你递归,行为就是未定义的? - Epigenetic
1
程序未符合标准,更加严谨的说法可能是非符合性。 - evets
一些早期的供应商特定编译器(如PRIME)允许递归。必须指定递归深度。 - cup
1个回答

3
正如这个问题的评论所指出的那样,禁止递归只是简单地说不允许使用递归。例如,Fortran 77有以下语句:

子程序不能直接或间接地引用自身。

这意味着程序员需要遵守这种限制以确保递归不会发生,并且编译器可以假设满足此条件1 Fortran 90允许递归,并从那时起一直到Fortran 2008,要想潜在地使用递归的子程序必须具有recursive前缀。
即使在Fortran 2018中(其中允许递归是默认的),正确使用递归也是对程序的限制:

如果由子程序直接或间接调用任何过程,则NON_RECURSIVE prefix-spec不得出现。

即使现在,编译器也不需要验证这一点。

1答案中关于违规检测的讨论并不真正适用于Fortran 77。那时,编译器可以更加相信程序员提供正确的程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接