“for”循环中的复杂更新规则
Posted
技术标签:
【中文标题】“for”循环中的复杂更新规则【英文标题】:Complex updating rule in 'for' loop 【发布时间】:2012-12-06 22:43:52 【问题描述】:我正在尝试编写以下“while”循环:
int x = N-1, y = 0;
while ( y < M )
/* Some work */
if ( x > 0 )
x--;
else
y++;
作为“for”循环。这是我的失败尝试:
for ( int x = N-1, y = 0 ; y < M ; ((x>0)?x--:y++) )
/* Some work */
这无法编译,因为正如编译器所说,更新规则不是语句。
你有没有办法将上面的“while”循环自然地写成“for”循环?
【问题讨论】:
你为什么不能把它作为一个while循环?for ( int x = N-1, y = 0 ; y < M ; ((x>0)?x--:y++) )
这将是无法理解的
@Daniel,原因之一是将变量保持在循环体中。
@Daniel,这是因为“for”循环为更新规则保留了一个位置。因此,当您阅读它时,您希望在那里找到该功能。
@Nikolay,我同意,但这是要问的原因之一。
【参考方案1】:
您可以随时将更新规则留空
for ( int x = N-1, y = 0 ; y < M ; )
if ( x > 0 )
x--;
else
y++;
【讨论】:
我会问,在这一点上,这实际上比while
循环更清楚吗?
这并不是更清楚,但 OP 并没有说他想让它更清楚。他只是说他想要一个 for 循环。据我所知,任务完成了。
@MarkByers 哦,这不是对答案的批评,只是一个注释。
在一点上,是的。 x 和 y 在循环外无法访问。【参考方案2】:
组合条件。
for(int x = N-1, y = 0; y < M ; y += (x > 0)?0:1, x += (x > 0)?-1:0)
我怀疑这应该是两个循环调用一个通用方法。
for(int x = N - 1; x >= 0; x--)
someMethod(x, 0);
for(int y = 0; y < M; y++)
someMethod(0, y);
【讨论】:
技术上是正确的,但请不要把它放在代码中。它是如此可怕地难以阅读。 但它似乎确实回答了隐含的问题,即如何仅使用 for 循环的 3 个参数在 for 循环中编写 while 循环。 @PeterLawrey。代码应该很简单。就像Brian Kernighan described it 一次一样。所以两个 for 循环 +1。 Google 上出现的此类答案一定是我在生产代码中看到可怕做法的原因。哈哈。不过,对于 OP 的问题的真正答案 +1。 其实在SO这里问问题之前我是在做两个循环的解决方案,但是我不想只写两行工作的方法,也不想违反DRY。无论如何,这对于 TopCoder 轮次都是可以的。谢谢!!!【参考方案3】:会
/* Some work */
包括变量 x 和 y?如果没有,有一种更简单的方法来编写循环的逻辑。目前,您的循环从 N-1 计数到零 (x),然后从零计数到 M-1 (y)。整个循环运行 (M+N)-1 次。
结合初始条件,可以写成:
for (int x = 1; x < M+N; x++)
/* Some work */
并完全取消 y 变量。
如果您需要将 x 和 y 变量保留为这些值,只需使用第三个变量:
for (int z = 1; z < M+N; z++)
/* Some work */
(x>0)?x--:y++;
希望这会有所帮助!
杰克
【讨论】:
谢谢@Jack。你是对的,一维参数化可能是一件好事,这取决于循环的主体。以上是关于“for”循环中的复杂更新规则的主要内容,如果未能解决你的问题,请参考以下文章