Почему пока не работает с оператором if и др - PullRequest
0 голосов
/ 16 марта 2020

Я хочу напечатать последовательность Коллатца и хочу, чтобы последовательность остановилась на 1.

, почему это приводит к бесконечному l oop, а часть кода while не дает работа;

number = input('Enter a no')
number = int(number)
while number !=1:
    if number % 2 == 0:
        number= number//2
        print(number)

    if number % 2 != 0:
        number=  3 * number + 1
        print(number)    

но это работает;

number = input('Enter a no')
number = int(number)
while number !=1:
    if number % 2 == 0:
        number= number//2
        print(number)

    else:
        number=  3 * number + 1
        print(number)    

Почему while не работает, если у меня есть два if сатейта? Это работает, если я использую оператор elif или else в конце. но не тогда, когда у меня есть два if

1 Ответ

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

Причина, по которой первая версия не работает, заключается в том, что вы потенциально дважды изменяете number в l oop.

С помощью else, который вы тестируете number % 2 - если нет остатка, вы меняете number путем деления его на два, тогда else пропускается, и вы снова тестируете числа != 1 и l oop. Если - это остаток, вы пропускаете это и выполняете остальное, устанавливая number = 3 * number + 1 и снова проверяете число != 1 на l oop. В любом случае вы изменили «число» только в один из двух возможных способов.

С двумя ifs вы проверяете number % 2 - если нет остальное вы изменяете number путем деления его на два, затем вы тестируете number % 2 снова ... но number могли бы изменить перед тестированием во второй раз.

Представьте себе, что вы выполняете это с числом, начинающимся с 6
6, разделенным на 2, это 3 с остатком 0, поэтому 6 % 2 == 0 и вы выполняете number = number//2, что дает 3
Сейчас вы тестируете if number % 2 != 0… но число сейчас уже 3, а 3, деленное на 2, равно 1 с остатком 1 - то есть 3 % 2 == 1, так что number % 2 действительно != 0, поэтому теперь вы меняете номер снова , во второй раз в l oop.

С else нет никак вы будете менять число дважды за одну итерацию цикла; с двумя 'если вы можете разделить на 2 , а затем также умножить и добавить.

...