具体地说,我正在尝试在Fortran中模拟the solution to Project Euler 31。为此,我需要读取一组硬币。而且由于该函数是递归的,由于该函数将被称为多次加载,因此我不想每次都必须将列表作为参数传递,因为如果我拥有列表的副本的加载,则代码也将具有负载内存开销。此外,在以前的问题中,例如简化分数的函数,我需要遍历非常大的列表。所以我的问题是:在Fortran中,如何从函数访问主程序中定义的变量。它甚至可以实现,如果不能实现,那么在减少任何内存重复方面有什么意图?
如有必要:
RECURSIVE FUNCTION NWAYS(AMOUNT,CUR_COIN,) RESULT(RES)
IMPLICIT NONE
INTEGER :: AMOUNT, CUR_COIN, RES, COINS !Coins is a list defined in the main program
RES = 0
IF (CUR_COIN<=1) THEN
RES = 1
RETURN
END IF
DO WHILE(AMOUNT>=0)
RES = RES + NWAYS(AMOUNT,CUR_COIN-1)
AMOUNT = AMOUNT-COINS(CUR_COIN)
END DO
RETURN
END FUNCTION NWAYS
答案 0 :(得分:5)
执行此操作的标准方法是在模块中定义变量,然后在函数中使用该模块。所以你会有类似的东西:
module var_mod
integer, allocatable :: coins(:)
end module var_mod
program euler
use var_mod
...
allocate (coins(ncoins))
...
recursive function nways (...)
use var_mod
...
现在nways中,可以看到阵列硬币,而不必每次都通过。我制作了可分配的硬币,以便您可以在主程序中将其分配为所需的大小。