Recursive Subroutine如何在fortran中运行?

时间:2014-05-05 21:44:12

标签: recursion fortran fibonacci subroutine

我试图了解递归子例程的工作原理。例如,这个递归函数计算斐波纳契数。

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

我可以在递归函数中总结2个斐波那契函数,但不能在递归子例程中求和。问题是我如何使用CALL方法在递归子程序中递归调用fibonacci subrioutine?

1 个答案:

答案 0 :(得分:4)

子程序对于这个特定问题并不好。非递归解决方案更具可读性。您尝试将子例程用作函数。你不能这样做,他们是非常不同的。您必须仅在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