如何计算嵌套for循环最内层循环的迭代总数?有什么配方吗?

时间:2010-08-03 10:42:03

标签: c loops

例如

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++;

所有迭代后count的值是多少?有没有计算它的公式?

3 个答案:

答案 0 :(得分:4)

这是求和的数学问题

基本上,人们可以证明:

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的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}]

答案 1 :(得分:2)

不是完整的答案,但是当i,j和k都相同时(比如说它们都是 n ),公式为C(n, nb_for_loops),这可能已经让你感兴趣了:)< / p>

    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 < / p>

答案 2 :(得分:1)

这大致是高音锥的量http://www.physicsinsights.org/pyramids-1.html =&gt; 1 / d *(n ^ d)(带d维)

该公式适用于实数,因此您必须将其调整为整数 (对于d = 2的情况(高锥体是一个三角形),1/2 *(n * n)成为众所周知的公式n(n + 1)/ 2(或n(n-1)/ 2)取决于如果你包括对角线或没有)。我让你做数学

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

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

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