【问题标题】:C++ dynamic nested for loopC++ 动态嵌套 for 循环
【发布时间】:2016-04-22 11:47:16
【问题描述】:

我正在尝试使用动态循环数来计算以下数量。伪代码看起来像

当 k = 1 时,

for (x1 =0;x1<=nmax[1];x1++){
    a = a + x1 * (x1>upper[1]);
}

当 k = 2

for (x1 =0;x1<=nmax[1];x1++){
    for (x2 =0;x2<=nmax[2];x2++){
        a = a + x1 * (x1<upper[1]) * x2 *(x1+x2>upper[2]);
    }
}

当 k = 3

for (x1 =0;x1<=nmax[1];x1++){
    for (x2 =0;x2<=nmax[2];x2++){
        for (x3 =0;x3<=nmax[3];x3++){
            a = a + x1 * (x1<upper[1]) * x2 *(x1+x2<upper[2]) * x3 *(x1+x2+x3>upper[3]);
        }
    }
}

nmax 和 upper 是预定义的向量。

为了说明布尔表达式背后的逻辑,作为一个例子,随着k的增加,布尔表达式的发展如下。对于第一个到最后一个之前的第二个,它是 .

(x1>upper[1])
(x1<upper[1]) AND (x1+x2>upper[2]) 
(x1<upper[1]) AND (x1+x2<upper[2]) AND (x1+x2+x3>upper[3])
(x1<upper[1]) AND (x1+x2<upper[2]) AND (x1+x2+x3<upper[3]) AND (x1+x2+x3+X4>upper[4])
(x1<upper[1]) AND (x1+x2<upper[2]) AND (x1+x2+x3<upper[3]) AND (x1+x2+x3+x4<upper[4]) AND (x1+x2+x3+x4+x5>upper[5])

有没有办法编写一个使用 k 作为参数的函数来实现上述功能?

【问题讨论】:

  • 您想生成所有可能的 x1, x2, ... xn 并计算值。你应该使用en.wikipedia.org/wiki/Backtracking
  • 将大小为kvector&lt;int&gt; x 初始化为全零。在一个循环中,将 1 加到 x[0];如果这导致它超过 nmax,将其重置为 0 并在 x[1] 上加一(如果 x[1] 结果超过,将其重置为 0 并增加 x[2],依此类推)。基本上,随着进位而增加。对于这样计算的x 的每个状态,运行第二个嵌套循环来计算总和并更新a
  • 感谢您的回复。 “运行第二个嵌套循环”是什么意思?

标签: c++ loops for-loop nested


【解决方案1】:

我推荐你使用递归函数。

int k;
int nestedLoop(int cur, int stValue) {
   int ret = 0;
   if( cur > k ) return 1;
   for(x=0;x<=nmax[cur];x++) {
       if( cur % 2 ) {
           ret = ret + x * 
               (stValue+x < upper[cur]) * nestedLoop(cur+1, stValue + x); 
       } else {
           ret = ret + x *
               (stValue+x > upper[cur]) * nestedLoop(cur+1, stValue + x);
       }
   }
   return ret
}

很抱歉,我现在无法测试它是否正确。但是通过这种方法可以实现您想要的方式。


仅用于简单的情况

int k = 3;
int nestedloop(int cur) {
    if(cur > k) { return 1; }
    int ret = 0;
    int i;
    for(int i=1;i<=5;i++) {
        ret = ret + i * nestedloop(cur+1);
    }
    return ret == 0 ? 1 : ret;
}

此代码与下一个代码相同。

for(int i=1;i<=5;i++){
    for(int j=1;j<=5;j++){
        for(int k=1;k<=5;k++){
            ret = ret + i * j * k;
        }
    }
}

【讨论】:

  • 非常感谢您的解决方案。我有个问题。条件 (cur % 2) 看起来很奇怪。布尔表达式仅对最后一个 x 使用 >。例如,对于 k=3,它是 (x1upper[3]);对于 k =4,它是 (x1upper[ 4])
  • 哦,我明白了。我误解了你的代码。但我认为最后一个运营商有点不同。为此,您应该更改条件部分。
  • 我试过你的方法,但它一直返回 1。似乎不起作用。
  • 我确实添加了 return ret。但在所有情况下它仍然返回 1。
  • 真的吗?我做了简单的案例,但它有效。我编辑我的帖子以添加我的简单代码。
猜你喜欢
  • 1970-01-01
  • 2011-03-26
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 2017-07-29
相关资源
最近更新 更多