Проблема управления процессом

Почему цикл не заканчивается в первый раз collatz() возвращает 1?

def collatz():
    global number
    if number % 2 == 0:
        number = number // 2
        print(number)
        return number
    else:
        number = 3 * number + 1
        print(number)
        return number

try:
    number = int(input('Please enter an integer except zero.\n'))
except ValueError:
    print("ValueError: invalid value.")
    number = int(input('You must enter an integer except zero.\n'))


while collatz() != 1:   # if input(4), the output will be: 4 2 1 4 2 1 
    collatz()


# another way, which works:
while number != 1:  --> # also input(4), the output will be: 4 2 1
    collatz()

1 ответ

Решение

В первом методе вы вызываете collatz() дважды в каждом цикле:

  • однажды в while collatz() != 1:где возвращаемое значение проверяется. Если он вернет 1 в этот момент, вы выйдете из цикла.
  • второй раз внутри тела цикла. На этот раз возвращаемое значение не проверяется, поэтому даже если оно равно 1, вы просто вернетесь к while линия.

Итак, когда вы вводите 4, ваш вывод:

  • 4 (ваш вклад)
  • 2 (пока линия)
  • 1 (тело - чтобы цикл не заканчивался)
  • 4 (пока линия)
  • 2 (тело)
  • 1 (пока строка - теперь цикл заканчивается)

Вы также можете написать свой цикл как:

while collatz() != 1:
    pass  # do nothing

Небольшой совет:

  • Избегайте использования глобальных переменных, они быстро становятся злыми
  • Отдельные проблемы: например, пусть ваш collatz() Функция принимает число в качестве параметра и возвращает следующее значение. Оставьте печать для остальной части кода.
  • постарайся не повторяться.

Вы можете изменить это так, например:

def collatz(n):
    if n % 2 == 0:
        n = n // 2
    else:
        n = 3 * number + 1
    return n

try:
    number = int(input('Please enter an integer except zero.\n'))
except ValueError:
    print("ValueError: invalid value.")
    number = int(input('You must enter an integer except zero.\n'))


while True:  # infinite loop
    number = collatz(number)
    print(number)
    if number == 1:
        # we break out of the loop
        break
Другие вопросы по тегам