如何规范化循环?

时间:2015-03-29 21:22:34

标签: algorithm loops for-loop

我真的想知道如何规范循环。换句话说,我想改变循环

来自

for (i = k; i <= n; i += c) // k>=0 n>=0 c>0

for (j = 0; j <= itNumber-1; j++) // itNumber is the number of iterations

如何找到itNumber = f ( n , k , c ) ??

提前致谢。

2 个答案:

答案 0 :(得分:1)

如何找到:

您正在寻找一种转换,它将为您提供一个“规范”循环,从零开始,并在每一步中将迭代器增加1。

首先,让我们偏移循环for (i = k; i <= n; i += c),以便i0for (i = 0; i <= n - k; i += c)开始,并为每个读取在循环内i出现i:=i+k。 (如果在循环中写入i,则无法在该方法中进行优化)

现在让我们来处理跳跃的差距。目前,i每次迭代增加c,因此我们必须除以c才能增加1for (i = 0; i <= (n - k)/c; i += 1),并且每个< strong>读取循环内i的出现i:=i*c

出于某种原因,您要求基本案例i<=itNumber-1,因此我们得到i <= (n - k)/c + 1 - 1,我们可以总结一下:

改变条件: f(n, k, c) = (n - k)/c + 1

并且循环内i的转换为:g(i) = c*(i+k)

计算在整数之间(如'C'),因此x/y实际上是整数部分:floor(x/y)

答案 1 :(得分:0)

啊,我终于明白了:)。

我认为它应该是k和n之间的差值除以增量,因此

itNumber = (n-k)/c