Fortran中的递归子例程是如何工作的?

4

我正在尝试理解递归子例程的工作原理。例如,这个递归函数计算斐波那契数。

RECURSIVE FUNCTION fibonacci(n) RESULT(fibo) 
  IMPLICIT NONE
  INTEGER, INTENT(IN) :: n
  INTEGER :: fibo
  IF (n <= 2) THEN 
    fibo = 1
  ELSE
    fibo = fibonacci(n-1) + fibonacci(n-2)
  END IF
END FUNCTION fibonacci

很遗憾,我无法使用递归子程序来计算它。
RECURSIVE SUBROUTINE fibonacci(n)  
  IMPLICIT NONE
  INTEGER, INTENT(IN) :: n
  INTEGER :: fibo
  IF (n <= 2) THEN 
    fibo = 1
  ELSE
    CALL fibonacci(n-1) + fibonacci(n-2)
  END IF
END SUBROUTINE fibonacci

我可以在递归函数中求解两个斐波那契函数,但无法在递归子例程中这样做。问题在于如何使用CALL方法在递归子例程中递归调用斐波那契子例程?

1个回答

7

对于这个特定的问题,子程序并不是很好。非递归解决方案更易读。您试图将子程序用作函数,但它们非常不同。您只能在call语句中使用一个子程序一次,并且只能使用一次。如果您想要一些结果,必须为此使用参数。

RECURSIVE SUBROUTINE fibonacci(n,fibo)  
  IMPLICIT NONE
  INTEGER, INTENT(IN) :: n
  INTEGER, INTENT(OUT) :: fibo
  INTEGER :: tmp
  IF (n <= 2) THEN 
    fibo = 1
  ELSE
    CALL fibonacci(n-1,fibo)
    CALL fibonacci(n-2,tmp)
    fibo = fibo + tmp
  END IF
END SUBROUTINE fibonacci


call fibonacci(5,i)

print *, i

end

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