如何内部';对于循环'';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

如何内部';对于循环'';s迭代器正在递增

这是一个强力方法,它将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,并且将在循环的第一次迭代中验证