我正在进行一项练习,其中基于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-statement 为true。只要初始值为0,这将执行循环,以便跳过它无数次。我尝试更改 i = 1 的初始值,但是打印了noe sum。然后我尝试在执行 if-statement 之前增加 i ,程序现在打印总和7.这里的问题是;如果我在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&lt; 4假,循环停止
while-loop 版本:
i = 0,i ++,sum = 1
i = 1,i ++,sum = 3
i = 2,i ++,sum + =我没有预先形成(继续)
i = 3,i ++,sum = 7
i = 4,i&lt; 4假,循环停止
在 while-loop 中,sum + = i的执行次数比 for循环更多。这是将 for-loop 转换为 while循环的正确方法吗?
int i = 0, sum = 0;
while (i < 3) {
i++;
if (i % 3 == 0) continue;
sum += i;
}
System.out.println(sum);
答案 0 :(得分:5)
你的1
专注于它是初始值,但这不是重点。关键是当i
为真时i % 3 == 0
永不递增,而0
不是初始值。所以while
循环永远循环。
您的2
没有任何意义:while
版本将永远循环,永远不会总结任何内容。
这是将for循环转换为while循环的正确方法吗?
不,你在错误的时间递增i
。
想一下for
循环是如何工作的:
初始化 - 首先,它将变量设置为第一个表达式中的值。
测试 - 然后使用第二个表达式测试值。
执行 - 如果值为true,则执行循环体。
增量 - 当循环体完成时,它执行第三个(增量)表达式。请注意,这是之后循环体。
让while
循环执行for
循环正在执行的操作。 (我故意不为你做这件事;这是一个学习练习。我会注意到转换for
循环的最佳方式不会使用continue
,然而,“最好”,当然是主观的。)
答案 1 :(得分:5)
在练习中,我被要求解释转换错误的原因,然后解决它
转换是错误的,因为当你达到模数3等于0的i
值时(在这种情况下是第一次迭代),你将跳到下一次迭代并重新验证。但是,由于您在不增加i
的情况下直接跳过,因此您将重新验证相同的条件并重新验证 ad-infinitum 。
你可以通过摆脱continue
并取消条件来轻松解决问题:
while (i < 4) {
if (i % 3 != 0)
sum += i;
i++;
}
答案 2 :(得分:3)
问题给出的 for-loop 如果转换为普通英语,则表示总结从 0到3 < / strong>并排除所有3的倍数。 (0 + 1 + 2 = 3)
for (int i = 0; i < 4; i++) {
if (i % 3 == 0) continue;
sum += i;
}
现在,我们问自己,我们如何将0加到x并使用 while-loop 排除所有3的倍数。我们将在不查看原始 for-loop 的情况下执行此操作。 (有时这样做更容易,因为我们已经知道了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的倍数(使用继续):
int i = 0;
while(i < 4){
if(i % 3 == 0){
i++; //Remember to increase i before continue
continue;
}
else
sum += i;
i++;
}
在continue
之后,将跳过下面的所有语句,您必须记住在调用i++
之前执行增量continue
。由于您现在已分为2个条件,因此将会有另一个i++
。
答案 3 :(得分:1)
根据while循环逻辑,变量i的增量是有条件的,而for循环则是无条件的。要使增量逻辑均匀,您应该在两种情况下递增。
我认为正确的转换是 -
int i = 0, sum = 0;
while (i < 4) {
if (i % 3 == 0) {i++;continue;}
sum += i;
i++;
}
System.out.println(sum);
答案 4 :(得分:0)
通常,增量将在while循环的最后一行。然而,在这场等待发生的灾难中#34;代码,有条件跳转到while块的末尾而不增加i。如果依靠i递增,请确保它始终在任何迭代上执行。而且,最后,因为你希望它第一次迭代。
while (i < 4) {
if (i % 3 == 0) {
// skip!
} else {
sum += i;
}
i++;
}