Задача для начинающих в цикле Python While - PullRequest
1 голос
/ 09 июля 2020

Почему это Хотя l oop не ломается и не останавливается

Я добавил снимок экрана вывода

term = 0
i = 13
while True:
    print i > 1
    print "i = ",i
    if i == 1:
        term += 1
        break
    if i%2 == 0:
        i = i / 2
        term += 1
    if i%2 != 0:
        i = i * 3 + 1
        term += 1

Вывод

I тоже пробовал Этот способ тоже

term = 1
i = 13
while i > 1:
    print i > 1
    if i%2 == 0:
        i = i / 2
        term += 1
    if i%2 != 0:
        i = i * 3 + 1
        term += 1

Ответы [ 3 ]

4 голосов
/ 09 июля 2020

Используйте elif, чтобы сделать случаи взаимоисключающими. Вы не хотите, чтобы несколько операторов if выполнялись в одной итерации l oop.

if i%2 == 0:
    i = i / 2
    term += 1
elif i%2 != 0:
    i = i * 3 + 1
    term += 1

Или просто сделайте это else, поскольку второе условие является избыточным.

if i%2 == 0:
    i = i / 2
    term += 1
else:
    i = i * 3 + 1
    term += 1

Причина, по которой он колеблется между 2 и 4, как написано, заключается в том, что 2 вызывает выполнение обоих операторов if. 2 ровно, поэтому первый запускается и делит пополам i, в результате получается 1. Теперь он нечетный, и срабатывает второй, превращая 1 в 4.

if i%2 == 0:
    i = i / 2       # 2 --> 1
    term += 1
if i%2 != 0:
    i = i * 3 + 1   # 1 --> 4
    term += 1

Следующая итерация 4 становится 2.

if i%2 == 0:
    i = i / 2       # 4 --> 2
    term += 1

Эти две итерации повторять снова и снова в бесконечном цикле.

1 голос
/ 09 июля 2020

Допустим, ваш i равен 2. Он делится на 2, поэтому if i % 2 == 0 срабатывает, а i становится 1. И код продолжает выполняться, так что теперь мы находимся на строке if i % 2 != 0, и это условие также истинно , потому что вы только что изменили i, и теперь это 1. Таким образом, i становится 4.

Ваша измененная вторая попытка, что предотвращает проверку второго условия, если первое выполнено успешно, ниже:

term = 1
i = 13
while i > 1:
    print(i > 1)
    if i % 2 == 0:
        i = i / 2
        term += 1
    elif i % 2 != 0:
        i = i * 3 + 1
        term += 1

Также обратите внимание, что на самом деле вам не нужно проверять второе условие, так как оно определенно верно, если первое не выполняется, поэтому строка elif ... может заменить только на else:

Вы также можете использовать ключевое слово continue, чтобы остановить выполнение остальной части l oop, если первое условие истинно:

term = 1
i = 13
while i > 1:
    print(i > 1)
    if i % 2 == 0:
        i = i / 2
        term += 1
        continue
    if i % 2 != 0:
        i = i * 3 + 1
        term += 1

Your первая попытка имеет точно такую ​​же проблему; исправление оставляю в качестве упражнения для читателя :)

PS не учить Python 2

0 голосов
/ 09 июля 2020

Проблема:

if i%2 == 0:
    i = i / 2
    term += 1
if i%2 != 0:
    i = i * 3 + 1
    term += 1

Проблема в том, что, если i % 2 == 0 равно true, оно останется истинным до i = 1. Как только i = 1, i % 2 != 0 выполняется и создает i = 4.

...