“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 &lt; M ; ((x&gt;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”循环中的复杂更新规则的主要内容,如果未能解决你的问题,请参考以下文章

C++中“for”循环的范围规则与C中不同? [复制]

JavaScript循环 while/do while/for的使用

什么时候使用规则引擎drools

Oracle 循环规则 4809

JavaScript的循环语句都有哪些?

最全153道Spring全家桶面试题,java数组用for循环赋值规则