![](/img/trans.png)
[英]Is there a way to tell how many times a for loop will execute before running it?
[英]how many times will this loop execute
我只是想知道这样的嵌套循环会运行多少次
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
与任意数量的total
。
它只需要一点编程知识。实际上,落后的逻辑只是计算方面的事情。 比方说:
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)
所以最终答案是1 + 3 + 6 + 10 + 15 + 21 + 28 + 36 + 45 = 165。
中间循环的第一次迭代添加
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
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 = 0
, j
从1..total - 1
i = 1
, j
从2..total - 1
i = 2
, j
从3..total - 1
... i = total - 2
, j
从total - 1 ..total - 1
(仅运行一次)
i = total - 1
,因为循环终止条件为true,所以不执行内部循环。
第三个循环取决于第二个内部循环k
从j..total - 1
运行
让我们合计为6
j
从1..5
运行-> k
运行5次( j = 1
)+ 4次( j = 2
)+ 3次( j = 3
)+ 2次( j = 4
)+ 1次( 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
。
数学上,上面是
((total ^ 3) - total) / 6
派生:
参考文献:
最外面的循环运行“总数”次。
对于每个外部循环,中间循环运行“总计-i”次。
即合计*合计+合计*(合计1)+合计*(合计2)....合计* 1
=总数*(总数+总数-1+总数-2 ... 1)
=总计*(1 + 2 + 3 ....总计)
=总数*(第一个“总数”自然数之和)
=总数*(总数*(总数+1)/ 2)
现在,最里面的循环也为每个中间循环运行“ total-j”次
即合计*(合计*(合计+1)/ 2)*(合计+(合计-1)+(合计2).... + 1)
=总数*(总数*(总数+1)/ 2)*(1 + 2 + 3 .... +总数)
=总数*(总数*(总数+1)/ 2)*(第一个“总数”自然数之和)
= total *(total *(total + 1)/ 2)*(total *(total + 1)/ 2)。因此,最终您会得到接近
总数*(总数*(总数+1)/ 2)*(总数*(总数+1)/ 2)。
抱歉,有一个更正,因为@andreas提到最里面和中间的循环仅运行到total-i-1次,在这种情况下,这将是第一个(total-1)个数之和,应为(total-1)* total / 2,因此最终输出应为
合计*(total *(total-1)/ 2)*(total *(total-1)/ 2)。
众所周知,算术级数的总和为:
最内层的循环将循环
次,这是j
的函数。
您对其进行归纳并得到i
的函数,又称:
您再次对其求和,得到一个total
为total
的函数:
对于Mathematica用户,结果是:
f[x_]:=Sum[Sum[x-j,{j,i+1,x-1}],{i,0,x-1}]
从这里 ,我们可以更清楚地看到它,并且最终结果是:
其中x
是total
。
如果我们运行此循环100次并生成一个数据集,然后对其进行图形处理,则会得到以下结果:
现在,此图显然是立方的。 因此我们可以使用ax ^ 3 + bx ^ 2 + cx + d的三次方程式进行求解。
使用4点,它们的值均为:
所以整个方程是
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>
该函数将循环(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))
像这样的简单循环:
for (i = a; i < b; i ++) {
....
}
如果a < b
,则运行ba
次迭代( i
取值: a
, a+1
, a+2
... b-2
, b-1
),否则运行0
次迭代。 下面我们将始终假设a < b
。
可以使用简单的数学公式计算其迭代次数:
我们从最里面的循环开始:
for(int k = j; k < t; k++) {
sum++;
}
其迭代次数为:
使用上面的公式, U
值为(t-1)-j+1
表示:
U = t - j
添加中间循环,迭代次数变为:
第二和的项是t-(i+1)
, t-(i+2)
,... t-(t-2)
, t-(t-1)
。
通过解决括号并将它们放在相反的顺序,它们可以写为:
1
, 2
,... ti-2
ti-1
令p = t - j
。 现在第二个和为:
它是第一个ti-1
自然数的总和,其值为:
加上外循环,总和为:
在最后一个总和上,表达式(t - i)
以t
开头(当i = 0
),以t-1
开头(当i = 1
),然后一直减小直到达到1
(当i = t - 1
)。 通过替换q = t - i
,最后一个和成为:
最后一个表达式从前n
平方数 的和中减去前n
自然数 的和 。 其值为:
现在很容易简化表达式:
发布的代码的迭代次数为:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.