这个循环会执行多少次
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
.
的任意数字来数学计算 sum
的总数
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++;
}
}
}
很容易看出外层循环运行s total
次。第二个循环比较棘手
让我们试着解决这个问题
i = 0
、j
运行 来自 1..total - 1
i = 1
、j
运行 来自 2..total - 1
i = 2
、j
运行 来自 3..total - 1
...
i = total - 2
、j
运行s 来自 total - 1 ..total - 1
(只会 运行 一次)
i = total - 1
,循环终止条件为真,内循环不执行
第三个循环依赖于第二个内部循环 - k
运行 来自 j..total - 1
让我们把总数设为 6
j
运行s 从 1..5
-> k
运行s 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
推导:
参考文献:
它只需要一点点 programming.Actually 逻辑知识,运行 背后只是计算类的东西。
比方说:
total=10,sum=0
-当i为0时:
那个时间 j 也用 1(i+1) 和 k 初始化。所以 k 将导致我们执行循环 9 次,并且随着 j 的增加,它将导致我们执行 sum 语句 8 次和 7 次,然后再执行 6 次直到 1 次。 (9+8+7+6+5+4+3+2+1=45次。)
-当i为1时:
时间 j 用 2 和 k 初始化,因为 well.So sum 语句将执行 8 次,然后 7 次,然后 6 次,直到 1。
(8+7+6+5+4+3+2+1=36次).
-当i为2时:
同样的事情重复发生但从不同的数字开始,所以这次是 (7+6+5+4+3+2+1=28)
- 所以这个序列一直持续到出现具有真实性的条件的意义为止。
这种情况一直持续到我 9 岁。
所以最后的答案是1+3+6+10+15+21+28+36+45=165。
最外层循环运行s 'total'次。
每个外层循环,中间循环运行s 'total-i'次。
即总计*总计+总计*(总计-1)+总计*(总计-2)....总计*1
=总计*(总计+总计-1+总计-2...1)
=总计*(1+2+3....总计)
=总计*(前'total'个自然数之和)
=总计*(总计*(总计+1)/2)
现在最里面的循环也是每个中间循环 运行s 'total-j' 次
即
总计*(总计*(总计+1)/2)*(总计+(总计-1)+(总计-2)....+1)
=总计*(总计*(总计+1)/2)*(1+2+3....+总计)
= total*(total*(total+1)/2)*(前'total'个自然数之和)
=总计*(总计*(总计+1)/2) * (总计*(总计+1)/2)..
所以最后你会得到接近
的东西
total * (total*(total+1)/2) * (total*(total+1)/2).
抱歉,@andreas 提到了最内层和中间循环 运行 的更正,直到 total-i-1 次
在这种情况下,它将是第一个 (total-1) no.s 的总和,它应该是 (total-1)*total/2 所以最终输出应该是
total * (total*(total-1)/2) * (total*(total-1)/2) .
等式如下
k 等于总数:
我们知道等差数列的和是:
最内层的循环将循环 for
次,这是j
.
的函数
你总结一下,得到一个函数 i
,又名:
你再总结一下,得到一个函数到total
,又名:
对于 Mathematica 用户,结果是:
f[x_]:=Sum[Sum[x-j,{j,i+1,x-1}],{i,0,x-1}]
从here看得更清楚,FINAL结果为:
其中 x
是 total
。
中间循环的第一次迭代添加
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
如果我们 运行 这个循环 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 ++) {
....
}
运行 b-a
次迭代(i
取值:a
、a+1
、a+2
...b-2
、b-1
) 如果 a < b
和 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
, ... t-i-2
, t-i-1
.
让p = t - j
。第二笔现在变成:
它是sum of the first t-i-1
natural numbers,它的值是:
添加外循环
加上外循环,总和变为:
在最后的总和中,表达式 (t - i)
以 t
开始(当 i = 0
时),以 t-1
继续(当 i = 1
时)并且它一直减少,直到达到 1
(当 i = t - 1
时)。通过替换 q = t - i
,最后的总和变为:
最后一个表达式减去the sum of the first n
natural numbers from the sum of the first n
square numbers。它的值为:
现在很容易简化表达式:
最终答案
贴出的代码迭代次数为:
我只是想知道像这样的嵌套循环会出现多少次 运行
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
.
sum
的总数
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++;
}
}
}
很容易看出外层循环运行s total
次。第二个循环比较棘手
让我们试着解决这个问题
i = 0
、j
运行 来自 1..total - 1
i = 1
、j
运行 来自 2..total - 1
i = 2
、j
运行 来自 3..total - 1
...
i = total - 2
、j
运行s 来自 total - 1 ..total - 1
(只会 运行 一次)
i = total - 1
,循环终止条件为真,内循环不执行
第三个循环依赖于第二个内部循环 - k
运行 来自 j..total - 1
让我们把总数设为 6
j
运行s 从 1..5
-> k
运行s 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
推导:
参考文献:
它只需要一点点 programming.Actually 逻辑知识,运行 背后只是计算类的东西。 比方说:
total=10,sum=0
-当i为0时:
那个时间 j 也用 1(i+1) 和 k 初始化。所以 k 将导致我们执行循环 9 次,并且随着 j 的增加,它将导致我们执行 sum 语句 8 次和 7 次,然后再执行 6 次直到 1 次。 (9+8+7+6+5+4+3+2+1=45次。)
-当i为1时:
时间 j 用 2 和 k 初始化,因为 well.So sum 语句将执行 8 次,然后 7 次,然后 6 次,直到 1。 (8+7+6+5+4+3+2+1=36次).
-当i为2时:
同样的事情重复发生但从不同的数字开始,所以这次是 (7+6+5+4+3+2+1=28)
- 所以这个序列一直持续到出现具有真实性的条件的意义为止。 这种情况一直持续到我 9 岁。
所以最后的答案是1+3+6+10+15+21+28+36+45=165。
最外层循环运行s 'total'次。
每个外层循环,中间循环运行s 'total-i'次。
即总计*总计+总计*(总计-1)+总计*(总计-2)....总计*1
=总计*(总计+总计-1+总计-2...1)
=总计*(1+2+3....总计)
=总计*(前'total'个自然数之和)
=总计*(总计*(总计+1)/2)
现在最里面的循环也是每个中间循环 运行s 'total-j' 次
即 总计*(总计*(总计+1)/2)*(总计+(总计-1)+(总计-2)....+1)
=总计*(总计*(总计+1)/2)*(1+2+3....+总计)
= total*(total*(total+1)/2)*(前'total'个自然数之和)
=总计*(总计*(总计+1)/2) * (总计*(总计+1)/2).. 所以最后你会得到接近
的东西total * (total*(total+1)/2) * (total*(total+1)/2).
抱歉,@andreas 提到了最内层和中间循环 运行 的更正,直到 total-i-1 次 在这种情况下,它将是第一个 (total-1) no.s 的总和,它应该是 (total-1)*total/2 所以最终输出应该是
total * (total*(total-1)/2) * (total*(total-1)/2) .
等式如下 k 等于总数:
我们知道等差数列的和是:
最内层的循环将循环 for
次,这是j
.
你总结一下,得到一个函数 i
,又名:
你再总结一下,得到一个函数到total
,又名:
对于 Mathematica 用户,结果是:
f[x_]:=Sum[Sum[x-j,{j,i+1,x-1}],{i,0,x-1}]
从here看得更清楚,FINAL结果为:
其中 x
是 total
。
中间循环的第一次迭代添加
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
如果我们 运行 这个循环 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 ++) {
....
}
运行 b-a
次迭代(i
取值:a
、a+1
、a+2
...b-2
、b-1
) 如果 a < b
和 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
, ... t-i-2
, t-i-1
.
让p = t - j
。第二笔现在变成:
它是sum of the first t-i-1
natural numbers,它的值是:
添加外循环
加上外循环,总和变为:
在最后的总和中,表达式 (t - i)
以 t
开始(当 i = 0
时),以 t-1
继续(当 i = 1
时)并且它一直减少,直到达到 1
(当 i = t - 1
时)。通过替换 q = t - i
,最后的总和变为:
最后一个表达式减去the sum of the first n
natural numbers from the sum of the first n
square numbers。它的值为:
现在很容易简化表达式:
最终答案
贴出的代码迭代次数为: