如何内部';对于循环'';s迭代器正在递增
本文关键字:迭代器 何内部 于循环 循环 | 更新日期: 2023-09-27 18:20:29
我有一个生成素数的函数。
内部的"for循环"有两个条件检查语句,最终导致内部的"for循环"中断。。因此,在内部for循环中断后,控制转移到外部for循环,再次遇到内部for循环,内部for循环以递增的k
值开始执行。
该值何时递增,而不是在指定的if
条件下中断执行?有人能给我解释一下函数中这段代码的工作原理吗?
public void prime()
{
int i = 5;
for (int j = 2; j <= i; j++)
{
for (int k = 2; k <= i; k++)
{
if (j == k)
{
Console.WriteLine(j);
break;
}
else if (j % k == 0)
{
break;
}
}
}
}
输出:
2
3
5
这是一个强力方法,它将2 .. limit
中的所有数字与之前所有搜索倍数的数字(同样是2 .. current
中的数字)进行测试,如果找到倍数,则该数字不是素数。
我在代码中添加了一些注释,使其更容易理解:
public void prime () {
int limit = 5;
/**
* Starting at 2, assuming the first prime number is 2
* Test all numbers against any number from 2, if the
* number being tested is a multiple of some other
* previous number, that number is NOT a prime
*/
for (int being_tested = 2; being_tested <= limit; being_tested++) {
for (int previous_value = 2; previous_value <= limit; previous_value++) {
/**
* If previous_value == being_tested then
* no multiples have been found
* thus "being_tested" is a prime number
*/
if (being_tested == previous_value) {
Console.WriteLine(being_tested);
break;
}
/**
* If modulus == 0 then "being_tested"
* is a multiple of previous_value,
* therefore, not a prime number
*/
else if (being_tested % previous_value == 0) {
break;
}
}
}
}
注意:我发布的原始代码的条件语句颠倒了,不会像预期的那样运行,这要感谢@Cemafo的指出。
当break被计数时,它会脱离内部循环,并在循环之后继续。内循环是外循环中唯一的东西,因此执行外循环的下一次迭代。这使j
递增。当再次执行内部循环时,k
被设置回2
,并且循环再次开始。k
的先前值(来自外循环的先前迭代)丢失。
函数本身是通过j
向上计数生成素数,然后检查每个小于它的数字(k
的值),看看j % k == 0
(不是素数,k是j的因子)还是j == k
(到目前为止没有发现j必须是素数的因子)。
内循环本身技术上循环到i
,但当k
达到j
时,循环被打破,因此当j
也等于i
时,k
才会达到i
。
无论如何,这里有一个详细的演练。。。k
每次从2开始,因为k
是在for循环内部声明的。首次运行。。。CCD_ 22,所以满足第一个if条件。break将其返回到外部for循环,并将j
递增到3。j = 3 k = 2
。。。if都不满足。k增量。。。CCD_ 25满足第一个if的条件并断开。j
递增。。。j = 4 k =2
。由于4 % 2 == 0
。断开内部for循环并返回到外部循环。CCD_ 29递增到5。运行内部循环,直到k
增加到5,并且第一个if条件验证为true。如果j
是偶数,则第二个if条件仅验证为true,并且将在循环的第一次迭代中验证