Проблема управления процессом
Почему цикл не заканчивается в первый раз 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