【问题标题】:Variable Number of for loops with code in between [closed]可变数量的 for 循环,其间有代码 [关闭]
【发布时间】:2016-10-09 20:51:03
【问题描述】:

所以我遇到的问题是我想通过以下方式实现 N 个 for 循环(其中 N 是一个变量):

for i0=0:MAX
   cOR[0] = initial + move[i0];
       for i1=0:MAX
           cOR[1] = cOR[0] + move[i1];
                ....
                some other stuff inside the final loop

(cOR是一个长度等于for循环次数的向量)

所以我发现这个解决方案在您只有嵌套循环 (https://stackoverflow.com/a/20577981/3932908) 时有效,但一直在努力为我的特殊情况修改它,因为我需要在 for 循环之间添加代码。有没有一种简单的方法来实现这一点,还是需要一种不同的方法?

【问题讨论】:

  • 什么?您不能让实际循环的数量(源代码中 fors 的数量)取决于某个运行时值。 C是一种编译语言,它不能那样工作。这听起来像XY problem
  • 您无法实现具有可变深度的嵌套循环。如果你真的想要,你可以进行递归。
  • 我同意:这听起来像是 XY 问题。您要解决的真正问题是什么?
  • 您可以轻松地递归循环遍历未知大小的嵌套数据,而无需使用称为递归函数的本质上可怕的语言“功能”。你只需要一些方法来返回到之前的迭代级别,就是这样。
  • 好的,所以我意识到没有办法直接实现这一点,但我提供的链接显示了一个解决方案,它模拟了这一点,但仅适用于嵌套循环之间没有代码的情况。看起来应该很容易概括,但我还没有弄清楚。

标签: c algorithm for-loop


【解决方案1】:

一般的做法是

  1. 编写递归函数。
  2. 如果由于某种原因递归不适合您的代码(例如,递归深度非常长,或者需要暂停执行的能力),则通过显式建模堆栈将递归版本转换为迭代版本。

做№1很容易:

void f(int depth, int initial, int *cOR)
{
    if(your termination condition)
    {
        // some other stuff inside the final loop, and...
        return;
    }

    for(int i = 0; i < MAX; ++i)
    {
        cOR[depth] = initial + move[i];
        f(depth+1, cOR[depth]);
    }
}

然后这样称呼它:

f(0, initial, cOR);

现在我们转到№2,即转换为非递归版本。我们需要的额外状态是之前存储在堆栈中的内容:i 变量的值。所以我们开始:

int i[max_depth];
int depth = 0;

for(;;)
{
    if(your termination condition)
    {
        // some other stuff inside the final loop, and...

        do {
            if(--depth < 0)
                return;
        } while(++i[depth] >= MAX);
    }
    else
        i[depth] = 0;

    cOR[depth] = (depth > 0 ? cOR[depth-1] : initial) + move[i[depth]];
    ++depth;
}

如果您无法先验估计max_depth,那么您可以切换到根据需要增长的动态分配数组。

【讨论】:

    猜你喜欢
    • 2020-05-19
    • 2015-07-18
    • 2021-09-25
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多