我试图了解递归子例程的工作原理。例如,这个递归函数计算斐波纳契数。
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?
答案 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