[英]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
在练习中,我被要求解释为什么转换是错误的然后修复它。 我的想法是:
同I = 0的初始值,这将触发立即继续进入将循环后,因为(0%3 == 0)将使if语句真。 只要初始值为0,这将执行循环,以便跳过它无数次。 我尝试更改i = 1的初始值,但是打印了noe sum。 然后我尝试在执行if语句之前递增i ,程序现在打印总和7.这里的问题是; 如果i在if语句之后递增,为什么程序不打印,即使i = 1的初始值表明(在我的脑海中)该程序应该正常运行?
我为每个程序制作了一个表来比较求和。
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
循环是如何工作的:
初始化 - 首先,它将变量设置为第一个表达式中的值。
测试 - 然后使用第二个表达式测试值。
执行 - 如果值为true,则执行循环体。
增量 - 当循环体完成时,它执行第三个(增量)表达式。 请注意,这是在循环体之后。
让你的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.