Выполняет ли следующая программа вложенный цикл на первой итерации внешнего цикла? - PullRequest
1 голос
/ 10 марта 2019

На первой итерации вложенного цикла i = 2 и j = 2.Однако условием для вложенного цикла является j < i.Значит ли это, что вложенный цикл не выполняется?Что происходит?

showPrimes(10);

function showPrimes(n) {
    nextPrime:

    for (let i = 2; i < n; i++) {
        for (let j = 2; j < i; j++)
            if (i % j == 0) continue nextPrime;
        console.log(i); // a prime number
    }
}

Ответы [ 4 ]

2 голосов
/ 10 марта 2019

Вот диаграмма, детализирующая ход вашей программы:

+---+---+-------------------------------------------------------------+
| i | j |                            Notes                            |
+---+---+-------------------------------------------------------------+
| 2 | 2 | Nested loop condition is false. Hence, 2 is a prime number. |
| 3 | 2 | 3 is not divisible by 2. Let's keep searching.              |
| 3 | 3 | Nested loop condition is false. Hence, 3 is a prime number. |
| 4 | 2 | 4 is divisible by 2. Hence, it's not a prime number.        |
| 5 | 2 | 5 is not divisible by 2. Let's keep searching.              |
| 5 | 3 | 5 is not divisible by 3. Let's keep searching.              |
| 5 | 4 | 5 is not divisible by 4. Let's keep searching.              |
| 5 | 5 | Nested loop condition is false. Hence, 5 is a prime number. |
| 6 | 2 | 6 is divisible by 2. Hence, it's not a prime number.        |
| 7 | 2 | 7 is not divisible by 2. Let's keep searching.              |
| 7 | 3 | 7 is not divisible by 3. Let's keep searching.              |
| 7 | 4 | 7 is not divisible by 4. Let's keep searching.              |
| 7 | 5 | 7 is not divisible by 5. Let's keep searching.              |
| 7 | 6 | 7 is not divisible by 6. Let's keep searching.              |
| 7 | 7 | Nested loop condition is false. Hence, 7 is a prime number. |
| 8 | 2 | 8 is divisible by 2. Hence, it's not a prime number.        |
| 9 | 2 | 9 is not divisible by 2. Let's keep searching.              |
| 9 | 3 | 9 is divisible by 3. Hence, it's not a prime number.        |
+---+---+-------------------------------------------------------------+

Надеюсь, это объясняет, почему программа работает, даже если вложенный цикл не выполняется, когда i = 2 и j = 2.

0 голосов
/ 10 марта 2019

Хорошо, давайте объясним этот вложенный цикл поэтапно:

  1. Первоначально i=2 и j=2, поэтому внешний цикл будет выполняться, но вложенный цикл не будет выполняться . пропуская внутренний цикл, он печатает 2, который находится в конце основного цикла console.log(i)

  2. Петли заканчиваются и i = 3. на этот раз j < i равно true, поэтому начинается вложенный цикл.

  3. Во время первого вложенного цикла i = 3 и j = 2

  4. continue не будет выполнено i % j не равно 0, поэтому оно заканчивается и j увеличивается. Теперь i=3 и j=3 и вложенные циклы выходят и печатает 3

  5. Теперь i=4 и вложенный цикл будут выполняться, потому что j=2 и j<i.
  6. Условие i % j равно true. Таким образом, на этот раз будет выполнено continue nextPrime, и внешний цикл начнется снова с i = 5.
  7. Теперь i = 5, поэтому будет выполнен вложенный цикл. Значения j будут 2 3 4 во вложенных циклах. Ни один из них не вызовет continue, потому что 5%2 5%3 или 5%4 не 0.
  8. Вложенный цикл завершится после того, как j станет 5. И он напечатает i, что 5.

    continue nextPrime делает все. Он проверит, если i % j == 0 это означает, что i не является простым Таким образом, он вернется к внешнему циклу с i = i + 1 и не перейдет последним к console.log()

showPrimes(6);

function showPrimes(n) {
    nextPrime:
    for (let i = 2; i < n; i++) {
        for (let j = 2; j < i; j++){
            console.log(`i:${i} j:${j}`)
            if (i % j == 0) continue nextPrime;
        }
        console.log(`prime${i}`); // a prime number
    }
}

Почему j меняется снова и снова

Потому что это локальная переменная и всегда инициализируется 2. Это не только ограничено внутренней петлей. Когда внутренний цикл завершается, он разрушается, и в следующем цикле он снова инициализируется до 2 из-за for (let j = 2; ...

0 голосов
/ 10 марта 2019

Вложенный цикл не выполняется в первой итерации внешнего цикла, т. Е. Когда i == 2.Во второй итерации внешнего цикла мы имеем i == 3, следовательно, условие вложенного цикла теперь читает j < 3, так что оно оценивается один раз со значением j == 2.Для третьей итерации внешнего цикла у нас есть i == 4, так что вложенный цикл оценивается дважды для значений 2 и 3. И т. Д.

Надеюсь, это поможет - Карлос

0 голосов
/ 10 марта 2019

Если простое число должно возвращать true для простых чисел, false для не простых чисел, тогда, когда вы обнаруживаете не простое число, просто возвращайте false.Как отмечают комментарии, вам не нужны две петли для этого.Вы можете просто выполнить цикл от 2 до n-1, пытаясь разделить без остатка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...