该循环执行多少次

时间:2018-09-03 04:40:28

标签: java nested-loops

我只是想知道这样的嵌套循环会运行多少次

int sum = 0;
for(int i = 0; i < total; i++) {
    for(int j = i + 1; j < total; j++) {
        for(int k = j; k < total; k++) {
            sum++;    
        }
    }
}
System.out.println(sum);

我可以轻松地看到sum的输出,但是我希望能够用数学方法计算出sum的总数为total的总数。

9 个答案:

答案 0 :(得分:1)

它只需要一点编程知识。实际上,运行在后面的逻辑只是计算方面的事情。 假设:

total=10,sum=0

-当我为0时:

那个时间j用1(i + 1)和k初始化。因此k将导致我们执行9次循环,并且随着j的增加,它将导致我们执行sum语句8次,7次,再执行6次直到1次。 (9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 = 45次。)

-当我为1:

那个时间j也用2和k初始化,所以sum语句将执行8次,然后执行7次,然后执行6次直到1。 (8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 = 36次)。

-当我2时:

同一件事重复发生,但以差数开头,所以这次(7 + 6 + 5 + 4 + 3 + 2 + 1 = 28)

  • 因此,此序列继续进行,直到有意义地真实出现该条件为止。 这种情况一直持续到我9岁。

所以最终答案是1 + 3 + 6 + 10 + 15 + 21 + 28 + 36 + 45 = 165。

答案 1 :(得分:1)

中间循环的第一次迭代添加

total-1 + total-2 + ... + 1 

总和。

中间循环的第二次迭代添加

total-2 + total - 3 + ... + 1 

求和

中间循环的最后一次迭代添加

1

总和。

如果将所有这些条件加在一起,您将得到

(total - 1) * 1 + (total - 2) * 2 + (total - 3) * 3 + ... + 2 * (total - 2) + 1 * (total - 1)

自从我学习数学以来已经有一段时间了,所以我不记得这个表达式是否有一个更简单的公式。

例如,如果总数为10,则得到:

9 * 1 + 8 * 2 + 7 * 3 + 6 * 4 + 5 * 5 + 4 * 6 + 3 * 7 + 2 * 8 + 1 * 9 =
9 + 16 + 21 + 24 + 25 + 24 + 21 + 16 + 9 = 
165

答案 2 :(得分:0)

TL; DR

该循环将执行((total ^ 3) - total) / 6次,因此它将是循环结束时sum的值。


int sum = 0;
for(int i = 0; i < total; i++) { 
    for(int j = i + 1; j < total; j++) {
        for(int k = j; k < total; k++) {
            sum++;    
        }
    }
}

很容易看出外部循环运行了total次。第二个循环比较棘手

让我们尝试解决这个问题

i = 0j1..total - 1运行

i = 1j2..total - 1运行

i = 2j3..total - 1运行

... i = total - 2jtotal - 1 ..total - 1运行(仅运行一次)

i = total - 1,因为循环终止条件为true,所以内部循环不执行。

第三个循环依赖于第二个内部循环-kj..total - 1开始运行

让我们将总数设为6

j1..5运行-> k运行5次(j = 1)+ 4次(j = 2)+ 3次({{1 }})+ 2次(j = 3)+ 1次(j = 4

(为其他人显示缩小版本)

j = 4

哪个

2..5 -> 4+3+2+1
3..5 3+2+1
4..5 2+1
5..5 1

通常

1 + 2 + 3 + 4 + 5+
1 + 2 + 3 + 4 + 
1 + 2 + 3 +
1 + 2 +
1

这归结为总和 1 + 2 + 3 + .. n + 1 + 2 + 3 +..n - 1+ 1 + 2 + 3 +..n - 2+ 1 + 2 + 3 + 1 + 2 + 1

对于n * (n - 1)) / 2所有值,范围为n

这可以通过以下方式验证

1 to total

int res = 0; for (int i = 1; i <= total; i++) { res += (i * (i - 1))/2; } 等于您的res

从数学上讲,

sum

派生:

enter image description here

enter image description here

enter image description here

参考:

Sums of the First n Natural Numbers

Sum of the Squares of the First n Natural Numbers

答案 3 :(得分:0)

最外层循环运行“总数”次。

对于每个外部循环,中间循环运行'total-i'次。

即合计*合计+合计*(合计1)+合计*(合计2)....合计* 1

=总数*(total + total-1 + total-2 ... 1)

=总数*(1 + 2 + 3 ....总数)

=总数*(第一个“总”自然数之和)

=总数*(总数*(总数+1)/ 2)

现在最里面的循环也为每个中间循环运行'total-j'次

即       总数*(总数*(总数+1)/ 2)*(总数+(总数-1)+(总数-2).... + 1)

=总数*(总数*(总数+1)/ 2)*(1 + 2 + 3 .... +总数)

=总数*(总数*(总数+1)/ 2)*(第一个“总数”自然数之和)

=总数*(总数*(总数+1)/ 2)*(总数*(总数+1)/ 2)。 所以最后您会得到一些接近的东西

  

总数*(总数*(总数+1)/ 2)*(总数*(总数+1)/ 2)。

对不起,因为@andreas提到了最里面和中间的循环只运行到total-i-1次,所以进行了更正 在这种情况下,它将是第一个(总计1个)编号的总和,应该是(总计1个)*总计2个,因此最终输出应为

  

total *(total *(total-1)/ 2)*(total *(total-1)/ 2)。

答案 4 :(得分:0)

等式如下 并且k等于total:

enter image description here

答案 5 :(得分:0)

我们知道,算术级数的总和是:

enter image description here

最里面的循环将循环

enter image description here

times,它是j的函数。

您将其总结并获得i的函数,又称:

enter image description here

您再次对其求和并获得total的函数,又称:

enter image description here


对于Mathematica个用户,结果是:

f[x_]:=Sum[Sum[x-j,{j,i+1,x-1}],{i,0,x-1}]

here中,我们可以更清楚地看到它,并且 FINAL 的结果是:

enter image description here

其中xtotal

答案 6 :(得分:0)

如果我们运行此循环100次并生成一个数据集,然后对其进行图形处理,则会得到:enter image description here

现在,此图显然是立方的。因此我们可以使用ax ^ 3 + bx ^ 2 + cx + d的三次方程式进行求解。

使用4点,它们的值均为:

enter image description here

所以完整的等式是

y=x^3/6-x/6
y=x(x^2/6-1/6)
y=(x/6)(x^2-1)

互动图:

<iframe src="https://www.desmos.com/calculator/61whd83djd?embed" width="500px" height="500px" style="border: 1px solid #ccc" frameborder=0></iframe>

答案 7 :(得分:0)

该函数将循环(total/6)*(total*total - 1)次 下面的代码段只是验证了这一点

var total = 100
var sum = 0;
for(var i = 0; i < total; i++) {
    for(var j = i + 1; j < total; j++) {
        for(var k = j; k < total; k++) {
            sum++;    
        }
    }
}

function calc(n) {
  return n*(n-1)*(n+1)/6
}

console.log("sum: "+sum)
console.log("calc: "+calc(total))

答案 8 :(得分:0)

像这样的简单循环:

for (i = a; i < b; i ++) {
    ....
}

运行b-a次迭代(i取值:aa+1a+2 ... b-2,{{1} }),如果b-1a < b迭代,否则。下面我们将始终假设0

可以使用简单的数学公式计算其迭代次数:

sum(i=a,b-1) 1

将公式应用于您的代码

我们从最里面的循环开始:

a < b

其迭代次数为:

sum(k=j,t-1) 1

使用上面的公式,for(int k = j; k < t; k++) { sum++; } 的值为U,这意味着:

(t-1)-j+1

添加中间循环

添加中间循环,迭代次数变为:

sum(j=i+1,t) sum(k=j,t-1) 1

第二个总和的项是U = t - j t-(i+1),... t-(i+2)t-(t-2)
通过解决括号并将它们放在相反的顺序,它们可以写为:
t-(t-1)1,... 2t-i-2

t-i-1。第二个和现在变成:

sum(p=1,t-i-1) p

它是sum of the first t-i-1 natural numbers,其值为:

sum(p=1,t-i-1) p=(t-i-1)*(t-i)/2

添加外循环

加上外循环,总和变为:

sum(i=0,t-1) sum(j=i+1,t) sum(k=j,t-1) 1=sum(i=0,t-1)((t-i-1)*(t-i)/2)=1/2*sum(i=0,t-1)(((t-i)-1)*(t-i))

在最后一个总和上,表达式p = t - j(t - i)开头(当t时),以i = 0继续(当t-1时),并且一直递减直到到达i = 11为止)。通过替换i = t - 1,最后一个和为:

1/2*sum(q=1,t)((q-1)*q)

最后一个表达式从the sum of the first n natural numbers中减去the sum of the first n square numbers。其值为:

S=1/2*(sum(q=1,t)q^2-sum(q=1,t)q)=1/2*((t*(t+1)*(2t+1))/6-(t*(t+1))/2)

现在很容易简化表达式:

S=1/2*1/6*(t*(t+1))*(2t+1-3)=1/6*(t*(t+1)*(t-1))=(t^3-t)/6

最终答案

已发布代码的迭代次数为:

(t^3-t)/6