这个循环会执行多少次

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 = 0j 运行 来自 1..total - 1

i = 1j 运行 来自 2..total - 1

i = 2j 运行 来自 3..total - 1

... i = total - 2j 运行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

推导:

参考文献:

前n个自然数之和

Sum of the Squares of the First n Natural Numbers

它只需要一点点 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结果为:

其中 xtotal

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

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 取值:aa+1a+2...b-2b-1) 如果 a < b0 迭代否则。我们将在下面假设 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。它的值为:

现在很容易简化表达式:

最终答案

贴出的代码迭代次数为: