计算循环中迭代次数的公式说明

Explanation of formula to count # of iterations in a loop

total iterations = (end - start + incr)/incr; // for <=
total iterations = (end - start  + incr - 1)/incr; // for <

我已经针对不同类型的 for 循环测试了这两个公式和每个公式的不同版本。我知道它们是如何工作的,但我不明白它们是如何制作的。

为什么总迭代次数=(结束值减去起始值+增量)/(除以增量)

为什么以及如何以这种方式选择和使用这些值来计算迭代次数。它们之间有什么联系?公式是怎么推导出来的?

我们先来看一下使用<=:

的循环
for (int i = start; i <= end; i += incr)

让我们看看每次迭代时 i 的值:

Iteration value of i
1 start
2 start + incr
3 start + 2*incr
4 start + 3*incr
... ...
n start + (n-1)*incr

情况 A. i 等于 end

如果end恰好是第二列中的一个值,例如end == start + k*incr对于某些k,那么我们可以看到迭代次数是k+1.

所以我们现在有以下规则:

如果end对于某个整数k可以写成start + k*incr,那么迭代次数是k+1所以我们可以写成:

end == start + (numIterations - 1)*incr

相当于说:

numIterations = (end - start) / incr + 1

或者:

numIterations = (end - start + incr) / incr

情况 B:i 永远不会等于 end

在这种情况下,没有满足 end == start + k*incr 的整数 k。我们可以 找到 end < start + k*incr 的最大 k。换句话说,有一个正 remainder < incr 这样 end == start + k*incr + remainder.

我们重复上一点的逻辑,但是non-zero余数:

end == start + (numIterations - 1)*incr + remainder

相当于说:

numIterations = (end - start - remainder) / incr + 1

或者:

numIterations = (end - start - remainder + incr) / incr

/表示整数除法时,我们不必减去那个分子中的remainder。整数除法将排除实数除法所得到的小数部分。所以我们可以简化为:

numIterations = (end - start + incr) / incr

我希望这能解释 <= end 循环的情况。

循环 < end

当循环变量不能等于end,最多等于end-1,那么我们将这种情况转化为条件为<= end - 1的循环。是等价的。

然后通过将 end 替换为 end-1 来应用上面的公式,我们得到您提供的公式的第二种形式。