【问题标题】:How the inner 'for loop' 's iterator is getting incremented?内部 'for loop' 的迭代器如何递增?
【发布时间】:2023-03-20 12:51:02
【问题描述】:

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

内部“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

【问题讨论】:

  • 您应该在调试器中单步执行以查看此代码的作用。

标签: c# for-loop break


【解决方案1】:

这是一种蛮力方法,它测试来自2 .. limit 的所有数字与所有以前的数字(同样来自2 .. current)搜索倍数,如果找到倍数,则该数字不是质数。

我在代码中添加了一些 cmets 以便于理解:

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 的指出,我发布的原始代码已反转条件并且不会按预期运行。

【讨论】:

  • 两个if语句需要切回,否则如果outer == innerouter % inner == 0会跳闸,不会输出。
  • 这里有两种改进算法的方法。首先,您只需要检查being_tested 是否可以被小于或等于其平方根的数字整除。之后的一切都是矫枉过正,因为你已经隐含地检查了它。其次,所有大于 5 的素数要么比 6 的倍数大 1,要么小 1。
【解决方案2】:

当遇到中断时,它会跳出内部循环并在循环之后继续。内循环是外循环中唯一的东西,所以执行外循环的下一次迭代。这增加了j。当再次执行内部循环时,k 被设置回2 并再次开始循环。 k 的先前值(来自外部循环的先前迭代)丢失。

函数本身通过 j 向上计数来生成素数,然后检查每个小于它的数字(k 的值)以查看是 j % k == 0(不是素数,k 是 j 的因数)还是 @987654328 @(到目前为止没有找到任何因子,所以 j 必须是素数)。

内部循环本身在技术上循环到i,但是当k 到达j 时循环被打破,所以k 只会在j 也等于i 时到达i

【讨论】:

    【解决方案3】:

    无论如何,这里有一个详细的演练...k 每次都从 2 开始,因为 k 是在 for 循环中声明的。第一次运行...j = 2 k =2 所以第一个 if 条件满足。 break 将其返回到外部 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。第二个 if 条件仅在 j 为偶数时验证为真,并且将在循环的第一次迭代中这样做

    【讨论】:

    • 这将通过增加 j 并检查是否有任何小于 j 的数字是因子来生成最高 i 的素数。
    猜你喜欢
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 2017-01-19
    • 2022-01-23
    相关资源
    最近更新 更多