我真的想知道如何规范循环。换句话说,我想改变循环
来自
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 )
??
提前致谢。
答案 0 :(得分:1)
如何找到:
您正在寻找一种转换,它将为您提供一个“规范”循环,从零开始,并在每一步中将迭代器增加1。
首先,让我们偏移循环for (i = k; i <= n; i += c)
,以便i
从0
:for (i = 0; i <= n - k; i += c)
开始,并为每个读取在循环内i
出现i:=i+k
。 (如果在循环中写入i
,则无法在该方法中进行优化)
现在让我们来处理跳跃的差距。目前,i
每次迭代增加c
,因此我们必须除以c
才能增加1
:for (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