【问题标题】:Is it possible to use fortran function as its own argument?是否可以使用 fortran 函数作为自己的参数?
【发布时间】:2014-04-09 18:03:41
【问题描述】:

我想找到一个本质上是递归的函数的值。例如,考虑如下定义的函数:

 A(m,n) = n+1 if m=0
        = A(m-1,A(m-1,n)) if m is not 0

在python中我可以很容易地编写这个函数:

def A(m,n):
    if(m==0):
        return n+1
    else:
        return A(m-1,A(m-1,n))

但我无法在 FORTRAN 中编写类似的函数。基本原因是 FORTRAN 函数不允许自己成为自己的参数。有什么办法可以解决这个问题吗?

提前致谢。

【问题讨论】:

  • 您使用的是哪个 Fortran 版本?我知道(至少)在 Fortran 90 中递归是可能的。这篇文章是 Fortran 递归的一个例子。 stackoverflow.com/questions/11816351/fortran-functions
  • 请注意,在您的示例代码中,A 不是A 的参数。 A 接受参数 mn 都没有显示出任何本身就是函数的迹象;相反,它们看起来好像是整数。 A 调用自身,它是递归的,但这与可以将自身作为参数处理的函数完全不同。

标签: python fortran


【解决方案1】:

如果您的编译器支持 fortran 90,这应该是您的问题的有效解决方案。

  program recursivetest
  implicit none
  integer A,n,m

  n=2
  m=2
  print*, A(m,n)
  end

  recursive function A(m,n) result (B)
  implicit none

  integer n,m,B,C

  if (m.ne.0) then
          C=A(m-1,n)
          B=A(m-1,C)
  else
          B=n+1
  endif

  end function

我使用 ifort(intel fortran composer 2011 sp.1)和 gfortran 编译了这段代码。英特尔 fortran 编译器还将允许对递归函数进行这种定义:

  recursive integer function A(m,n)

或:

  integer recursive function A(m,n)

严格的 FORTRAN 77 标准不直接支持递归函数,尽管有一些方法可以解决这个问题。如果您使用 FORTRAN 77,请告诉我们。我现在无法对其进行测试,也不确定它是如何工作的。

【讨论】:

  • 您的示例 2 没有解决任何问题。递归仍然是递归,即使它不是直接的。
  • 你可能是对的。我把 FORTRAN 77 弄乱了。我把它拿出来了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
  • 2011-10-28
  • 2019-10-10
  • 2022-09-27
  • 1970-01-01
相关资源
最近更新 更多