【问题标题】:how to calculate total no of iteration of innermost loop of nested for loop? is there any formula?如何计算嵌套for循环的最内层循环的迭代总数?有什么公式吗?
【发布时间】:2010-08-03 10:42:02
【问题描述】:

例如

int count=0
for(int i=0;i<12;i++)
   for(int j=i+1;j<10;j++)
       for(int k=j+1;k<8;k++)
           count++;
System.out.println("count = "+count);

for(int i=0;i<I;i++)
   for(int j=i+1;j<J;j++)
       for(int k=j+1;k<K;k++)
        :       
        :
        :
        for(int z=y+1;z,<Z;z,++,)
         count++;

所有迭代后的计数值是多少?有什么公式可以计算吗?

【问题讨论】:

  • 我不敢相信有一个“问题”标签。
  • 这是作业吗?它看起来很像家庭作业。
  • @Marcelo Cantos:嗯,我能找到两个 ;)
  • @Felix Kling:啊,当然。但他们是否按下了“s”按钮?
  • 试图解决这个问题会让我的大脑受伤。

标签: c loops


【解决方案1】:

这是一个求和的数学问题

基本上,可以证明:

for (i=a; i<b; i++) 
    count+=1 

等价于

count+=b-a

同样,

for (i=a; i<b; i++) 
    count+=i 

等价于

count+= 0.5 * (b*(b+1) - a*(a+1))

您可以使用例如 wolframalpha (Wolfram's Mathematica) 获得类似的公式

这个系统会为你做符号计算,例如,

for(int i=0;i<A;i++)
   for(int j=i+1;j<B;j++)
      for(int k=j+1;k<C;k++)
          count++

是一个 Mathematica 查询:

http://www.wolframalpha.com/input/?i=Sum[Sum[Sum[1,{k,j%2B1,C-1}],{j,i%2B1,B-1}],{i,0,A-1}]

【讨论】:

    【解决方案2】:

    不是一个完整的答案,但是当 i、j 和 k 都相同时(假设它们都是 n),公式是 C(n, nb_for_loops),您可能已经感兴趣了 :)

        final int n = 50;
        int count = 0;
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                for (int k = j + 1; k < n; k++) {
                    for (int l = k+1; l < n; l++) {
                        count++;
                    }
                }
            }
        }
        System.out.println( count );
    

    将给出 230300,即 C(50,4)。

    您可以使用 binomail 系数轻松计算:

    http://en.wikipedia.org/wiki/Binomial_coefficient

    一个计算公式是:n! / (k! * (n-k)!)

    例如,如果您想知道从 52 张卡片组中可以取出多少张不同的 5 张卡片,您可以使用 5 个嵌套循环或使用上面的公式,它们都会给出:2 598 960

    【讨论】:

    • 如果我们将第一个循环分成 2 个对称循环(停止和启动 n/2),我们可以重写嵌套循环以停止 n/2,因此结果变为(当每个循环停止前一个循环时 -1 ) 2*C(n/2, for_loops) ,如果我是对的。
    【解决方案3】:

    这大约是一个超金字塔的体积http://www.physicsinsights.org/pyramids-1.html => 1/d * (n ^d)(具有 d 维)

    该公式适用于实数,因此您必须将其调整为整数 (对于 d=2 的情况(则超金字塔是一个三角形),1/2*(n*n) 成为众所周知的公式 n(n+1)/2 (或 n(n-1)/2) 取决于是否包括对角线)。我让你算算

    我认为你没有一直使用 n 但 I,J,K 不是问题,因为你可以将每个循环重写为 2 个循环在中间停止,因此它们都以相同的数字停止

    公式可能变成 1/d*((n/2)^d)*2(我不确定,但类似的应该没问题)

    这不是您问题的真正答案,但我希望这将有助于找到一个真正的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      • 2013-05-09
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      相关资源
      最近更新 更多