Python - почему это бесконечное l oop? - PullRequest
0 голосов
/ 23 марта 2020

У меня есть следующий код:

sum_of_primes = 0
n = 2
while n < 10:
    for i in range(2,n):
        if n%i == 0:
            n += 1
            break
        else:
            sum_of_primes += i
            n += 1
print(sum_of_primes)

Я не могу понять, почему это бесконечное l oop.

Ниже мой модифицированный код, который работает, но я все еще не понимаю, почему оригинальный код создает бесконечное l oop:

counter = 0
primes = 0
number = 2

while counter < 10:

    for x in range(2, number):
        if number % x == 0:
            number += 1
            counter+=1
            break
    else:

        primes +=number
        counter = number
        number += 1

print(primes)

Ответы [ 4 ]

1 голос
/ 23 марта 2020

Изначально n равно 2. Поэтому for l oop - это for i in range(2,2), который является пустым диапазоном, поэтому l oop никогда не выполняется. Это означает, что вы никогда не попадете в код, который может увеличивать n.

sum_of_primes = 0
n = 2
while n < 10:      # n == 2
    for i in range(2,n):   # loop repeats zero times
        if n%i == 0:
            n += 1
            break
        else:
            sum_of_primes += i
            n += 1
    # n == 2 still the case down here.
print(sum_of_primes)
1 голос
/ 23 марта 2020

Ваш внутренний l oop никогда не выполняется, поскольку range(2, 2) пусто. Поскольку внутренний l oop обновляет n, n никогда не изменяется, поэтому внешний l oop никогда не прекратит работу.

n = 2
while n < 10:
    for i in range(2,n):  # list(range(2,2)) == [] ...
        # ... so this loop never executes
        # and n is never updated
    # so this loop runs forever
0 голосов
/ 23 марта 2020
for i in range(2,n):

это означает, что диапазон равен (2,2), l oop никогда не начинался, поскольку его начало и конец такие же, как 2-2.

0 голосов
/ 23 марта 2020

Вы написали, что for i in range(2,n): и в начальной точке n=2. Таким образом, ваш диапазон будет range(2,2), поэтому он вернет пустой список, так что l oop никогда не выполнится, и ваша программа пропадет бесконечно l oop.

И во втором используемом вами коде for...else

for x in range(2, number):
    if number % x == 0:
        number += 1
        counter+=1
        break
else:
    primes +=number
    counter = number
    number += 1

Здесь значение for...else означает, что если для l oop не будет выполнен один раз, то будет выполнена часть else для l oop. И в else части вы увеличиваете counter и number.

, поэтому, в первый раз number = 2 и для l oop станут for x in range(2, number):, значение для l oop не будет выполняется так, как я обсуждал выше, если для l oop не превышать один раз else часть будет выполнена

Так, в else номер детали будет увеличен на 1, затем в следующей итерации Вы для l oop станете for x in range(2,3), поэтому в это время для l oop будет успешно выполнено ...

Для for...else Ссылка

...