繁体   English   中英

将带有continue语句的for循环转换为while循环

[英]Converting a for-loop with continue statement to while-loop

我正在进行一项练习,其中基于for循环的一小段代码被转换为使用while循环执行相同的操作。 目的转换是错误的,如下所示:

int sum = 0;

    for (int i = 0; i < 4; i++) {
        if (i % 3 == 0) continue;
        sum += i;   
    }
System.out.println(sum); // prints 3

这转换为:

int i = 0, sum = 0;

        while (i < 4) {
            if (i % 3 == 0) continue;
            sum += i;   
            i++;    
        }
System.out.println(sum); // will not print

在练习中,我被要求解释为什么转换是错误的然后修复它。 我的想法是:

  1. I = 0的初始值,这将触发立即继续进入将循环后,因为(0%3 == 0)将使if语句真。 只要初始值为0,这将执行循环,以便跳过它无数次。 我尝试更改i = 1的初始值,但是打印了noe sum。 然后我尝试在执行if语句之前递增i ,程序现在打印总和7.这里的问题是; 如果i在if语句之后递增,为什么程序不打印,即使i = 1的初始值表明(在我的脑海中)该程序应该正常运行?

  2. 我为每个程序制作了一个表来比较求和。

for-loop版本:

i = 0,sum + = i未执行(继续),i ++

i = 1,sum = 1,i ++

i = 2,sum = 3,i ++

i = 3,sum + = i未执行(继续),i ++

i = 4,i <4 false,循环停止

while循环版本:

i = 0,i ++,sum = 1

i = 1,i ++,sum = 3

i = 2,i ++,sum + =我没有预成型(续)

i = 3,i ++,sum = 7

i = 4,i <4 false,循环停止

while循环中 ,sum + = i比for循环更多地执行 这是将for循环转换为while循环的正确方法吗?

int i = 0, sum = 0;

        while (i < 3) {
            i++;
            if (i % 3 == 0) continue;
            sum += i;           
        }

        System.out.println(sum);

你的1专注于它是初始值,但这不是重点。 的一点是, i当从未递增i % 3 == 0为真,而不是0是初始值。 所以while循环永远循环。

你的2没有任何意义: while版本将永远循环,永远不会总结任何东西。

这是将for循环转换为while循环的正确方法吗?

不,你在错误的时间递增i

想想for循环是如何工作的:

  1. 初始化 - 首先,它将变量设置为第一个表达式中的值。

  2. 测试 - 然后使用第二个表达式测试值。

  3. 执行 - 如果值为true,则执行循环体。

  4. 增量 - 当循环体完成时,它执行第三个(增量)表达式。 请注意,这是循环体之后。

让你的while循环执行for循环正在做的事情。 (我故意为你做这个;这是一个学习练习。我会注意到转换for循环的最佳方法不会continue使用。“最好,”当然是主观的。)

在练习中,我被要求解释为什么转换是错误的然后修复它

转换是错误的,因为当你达到模3等于0的i值时(在这种情况下是第一次迭代),你将跳到下一次迭代并重新验证。 但是,由于您在不增加i情况下直接跳过,因此您将重新验证相同的条件并重新验证ad-infinitum

你可以通过摆脱continue和否定条件轻松地解决它:

while (i < 4) {
    if (i % 3 != 0)
        sum += i;

    i++;    
}

问题给出的for循环如果转换为普通英语 ,则表示从0到3的 总和并排除3的 所有倍数 (0 + 1 + 2 = 3)

   for (int i = 0; i < 4; i++) {
        if (i % 3 == 0) continue;
        sum += i;   
    }

所以现在,我们问自己,我们如何将0加到x并使用while循环排除所有3的倍数。 我们将在不查看原始for循环的情况下执行此操作。 有时这样做更容易,因为我们已经知道for循环的意图

总结从0到3的数字:

int i = 0;
while(i < 4){
    sum += i;
    i++;
}

要将0到3之间的数字相加,不包括3的倍数:

int i = 0;
while(i < 4){
    if(i % 3 != 0)
        sum += i;
    i++;
}

要将0到3之间的数字相加,不包括3的倍数(使用continue):

int i = 0;
while(i < 4){
    if(i % 3 == 0){
        i++;       //Remember to increase i before continue
        continue;
    }
    else
        sum += i;
    i++;
}

continue ,将跳过它下面的所有语句,你必须记住在调用continue之前做一个增量i++ 由于你现在已经分为2个条件,因此将会有另一个i++

根据while循环逻辑,变量i的增量是有条件的,而for循环则是无条件的。 要使增量逻辑均匀,您应该在两种情况下递增。

我认为正确的转换将是 -

int i = 0, sum = 0;

while (i < 4) {
    if (i % 3 == 0) {i++;continue;}
    sum += i;   
    i++;   
}
System.out.println(sum);

通常,增量将在while循环的最后一行。 但是,在这个“等待发生的灾难”代码中,有一个条件是跳转到while块的末尾而不增加i。 如果依靠i递增,请确保它始终在任何迭代上执行。 而且,最后,因为你希望它第一次迭代。

    while (i < 4) {
        if (i % 3 == 0) {
          // skip!
        } else {
          sum += i;   
        }
        i++;    
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM