这个循环体重复了多少次?

How many times is this loop body repeated?

在我的面向对象编程课程中,我们讨论了一个我认为他从未命名过的主题,我试图找出它的名字是为了找到解决这些问题的正确方法,但我有运气不好。

这不是作业,而是一个问题,用于澄清解决此问题的过程。

for I = (N + 2) downto -1
    for J = (I - 1) to (N + 4)
        // Code is run here

问题是"How many times is // Code is run here ran?"

以下是我尝试解决的问题:

1) I = (N + 2), J = [(N + 2) - 1] 从这个(和我记得的)你使用 b - a - 1 来解决执行的次数,这给了我们 X = [(N + 2) - 1] - (N + 2) - 1可以简化为 X = -2

2) I = -1, J =((-1) - 1)andX = ((-1) - 1) - (-1) - 1which simplifies toX = -2`

我在处理第二个 for 循环以及如何完成问题时迷失了方向。我知道我们必须以 r(r + 1)/2

这样的答案结束

我只是想说,我曾试图寻找这种技术的名称,但他只是简单地称之为 "Code Counting" return 没有任何与此主题相关的搜索.

谢谢

编辑:这门课程在 Java 中,所以如果有人好奇的话,这就是为什么我使用 Java 标签来回答这个问题。

EDIT2:澄清一下,这是在笔试中进行的,所以我们应该通过笔试来完成, 我想解释一下如何解决这个问题,因为我已经尝试了很多次,但仍然得到错误的答案。

只要看看 "code" 并开始逻辑计数。在外循环(称为 OL)的第一次迭代中,您执行内循环 (IL) (N + 4) - (N + 2 - 1) + 1= 4 次。

+1的解释:如果我们运行从-1到2的循环,我们实际上运行它4次:-1 , 0, 1, 2, 在数学上是 `2 - (-1) + 1.

下一次I = N + 1,因此IL运行s(N + 4) - (N + 1 - 1) + 1= 5次。下一步和之后的步骤也是如此,每次执行IL的次数增加一次:4 + 5 + 6 + ...。剩下的问题是我们能走多远。

最后一步是I = -1,IL得到运行(N + 4) - (-1 - 1) + 1 = N + 7次。

因此您要查找的总和似乎是 4 + 5 + 6 + ... + (N + 6) + (N + 7)。这实际上类似于 r(r + 1)/2 加上一些减法和加法。

以上数字假定 to 边界包含在内。

注意:每当您想出某种公式时,请选择较小的输入参数(例如 0 或 1)并验证该公式是否适用于该值。

使用小高斯公式 r * (r + 1) / 2 对值求和,我们得到 r -> N + 7。因此 (N + 7) * (N + 8) / 2。但是接下来我们把3、2、1也算进去,其实上面的list中没有,我们需要减去它们,得到最终的解:

(N + 7) * (N + 8) / 2 - 6

问题中显示的算法看起来像很好的旧 Basic 语法

for X down/to Y, that includes Y

外循环从n+2-1,所以内循环是

n+1 to n+4 =>   4 iterations
...
 -2 to n+4 => n+7 iterations

将所有这些相加,我们得到

n+3
 ∑ (4+i)  =  4(n+4) + (n+3)(n+4) / 2
i=0
          =  (n+11)(n+4) / 2

也等于(N + 7)(N + 8) / 2 - 6