recursion - 如何制作在内部使用循环变量的递归嵌套循环?

标签 recursion fortran nested-loops

我需要制作一个任意深度的嵌套循环。递归循环似乎是正确的方法,但我不知道如何在循环中使用循环变量。例如,一旦我将深度指定为 3,它应该像

count = 1 
for i=1, Nmax-2
    for j=i+1, Nmax-1
        for k=j+1,Nmax
            function(i,j,k,0,0,0,0....) // a function having Nmax arguments
            count += 1
        end
    end
end

我想制作一个以循环深度为参数的子程序。

更新:

我实现了 Zoltan 提出的方案。为了简单起见,我用 python 编写了它。
count = 0;

def f(CurrentDepth, ArgSoFar, MaxDepth, Nmax): 
    global count;
    if CurrentDepth > MaxDepth:
        count += 1;
        print count, ArgSoFar;
    else:
        if CurrentDepth == 1:
            for i in range(1, Nmax + 2 - MaxDepth):
                NewArgs = ArgSoFar;
                NewArgs[1-1] = i;
                f(2, NewArgs, MaxDepth, Nmax);
        else:
            for i in range(ArgSoFar[CurrentDepth-1-1] + 1, Nmax + CurrentDepth - MaxDepth +1):
                NewArgs = ArgSoFar;
                NewArgs[CurrentDepth-1] = i;
                f(CurrentDepth + 1, NewArgs, MaxDepth, Nmax);

f(1,[0,0,0,0,0],3,5)

结果是
1 [1, 2, 3, 0, 0]
2 [1, 2, 4, 0, 0]
3 [1, 2, 5, 0, 0]
4 [1, 3, 4, 0, 0]
5 [1, 3, 5, 0, 0]
6 [1, 4, 5, 0, 0]
7 [2, 3, 4, 0, 0]
8 [2, 3, 5, 0, 0]
9 [2, 4, 5, 0, 0]
10 [3, 4, 5, 0, 0] 

可能有更好的方法来做到这一点,但到目前为止,这个方法很好用。在 fortran 中这样做似乎很容易。非常感谢你的帮助!!!

最佳答案

这是您可以随心所欲的一种方式。这是伪代码,我写的还不够多,无法编译和测试它,但你应该得到图片。

定义一个函数,我们称之为 fun1它特别需要一个整数数组参数,也许像这样

<type> function fun1(indices, other_arguments)
    integer, dimension(:), intent(in) :: indices
    ...

你可以这样称呼
fun1([4,5,6],...)

对此的解释是,该函数将使用 3 层深的循环嵌套,如下所示:
do ix = 1,4
    do jx = 1,5
        do kx = 1,6
        ...

当然,您不能编写深度在运行时确定的循环嵌套(无论如何不在 Fortran 中),因此您可以沿着
do ix = 1, product(indices)

如果您需要循环内各个索引的值,您将需要展开线性化索引。请注意,您所做的只是编写代码将数组索引从 N 维转换为一维,反之亦然;当您可以在编译时指定数组的等级时,这就是编译器为您所做的。如果内部循环不是在整个索引范围内运行,您将不得不做一些更复杂的事情,需要仔细编码但并不困难。

根据您实际尝试执行的操作,这可能是也可能不是一个好的甚至令人满意的方法。如果你想写一个函数来计算数组中每个元素的值,当你写这个函数时,这个数组的等级是未知的,那么前面的建议是完全错误的,在这种情况下你会想写一个 elemental功能。如果您需要更多信息,请更新您的问题。

关于recursion - 如何制作在内部使用循环变量的递归嵌套循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18277133/

相关文章:

python - 嵌套字典的迭代器类

python - 将 `functools.lru_cache` 应用于 lambda

recursion - 方案:给定列表的列表和排列,排列

java - 为什么我的递归方法中的结果字符串没有更新?

arrays - 以向量下标作为过程参数的数组部分

r - 将数据从 Fortran 传递到 R

c - 如何存储来自 sqlite3_open 的数据库连接句柄?

python - 如何在列表内部的 python 中运行嵌套循环,以便外循环始终从列表的下一个元素开始,依此类推

java - 嵌套循环: Print seats in java

python - 使用递归在 Python 中生成给定长度的所有二进制字符串的最佳方法是什么?