如何内在的循环'迭代器正在增加?

时间:2013-06-28 16:42:41

标签: c# for-loop break

我有一个生成素数的函数。

内部'for-loop'有两个条件检查语句,最终导致内部'for-loop'的破坏。 因此,在内部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

3 个答案:

答案 0 :(得分:0)

无论如何,这是一个详细的演练... k每次从2开始,因为{for循环中声明了k。首先运行... j = 2 k =2所以第一个if条件得到满足。中断将其返回到外部for循环,并将j递增到3. j = 3 k = 2 ...如果满足则不会。 k个增量... j = 3 k =3符合第一个if和break的条件。 j递增... j = 4 k =2。第一次传递导致第二个if表达式返回true,因为4 % 2 == 0。打破内部for循环并返回外部循环。 j递增到5.运行内部循环,直到k递增到5并且第一个if条件验证为true。如果j是偶数,则第二个if条件仅验证为true,并且将在循环的第一次迭代中执行此操作

答案 1 :(得分:0)

当中断时,它会突破内部循环并在循环后继续。内部循环是外部循环中唯一的东西,因此执行外部循环的下一次迭代。这会增加j。再次执行内循环时,k将重新设置为2并再次启动循环。 <{1}}的前一个值(来自外部循环的上一次迭代)将丢失。

函数本身通过k计数生成素数,然后检查每个数字(j的值)以查看是否k(不是素数,k是因子) j)或j % k == 0(到目前为止没有找到因子,所以j必须是素数)。

内部循环本身技术上循环到j == k,但当i到达k时,循环被打破,因此j只会到ki也等于j

答案 2 :(得分:0)

这是一种蛮力方法,它测试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;
            }
        }
    }
}

注意:我发布的原始代码的条件已经反转,并且无法按预期运行,这要归功于@Cemafor指出它。