计算循环中迭代次数的公式说明
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
来应用上面的公式,我们得到您提供的公式的第二种形式。
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
来应用上面的公式,我们得到您提供的公式的第二种形式。