【问题标题】:How does Recursive Subroutine works in fortran?递归子程序如何在 fortran 中工作?
【发布时间】:2014-06-22 08:14:37
【问题描述】:

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

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 方法在递归子程序中递归调用斐波那契子程序?

【问题讨论】:

    标签: recursion fortran fibonacci subroutine


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 2017-01-18
      • 1970-01-01
      • 2023-02-06
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多