В вашей функции отсутствуют какие-либо операторы return
, поэтому по умолчанию она возвращает None
.Возможно, вы захотите определить функцию, чтобы она возвращала количество шагов от 1
от введенного числа.Вы можете даже кэшировать таких результатов.
Вы, кажется, хотите сделать рекурсивный вызов, но вы также используете цикл while
.Выберите одно или другое.
При повторении вы не можете иметь для переназначения переменной, вы можете выбрать выражение в вызове, например:
if number % 2 == 0:
collatz(number / 2)
elif ...
Это приносит нам суть дела.В ходе рекурсии вы создали много стековых фреймов, каждый из которых имеет свою собственную закрытую переменную с именем number
и содержит различные значения.Вы вводите себя в заблуждение, изменяя number
в текущем кадре стека, и , копируя его в кадр следующего уровня, когда вы делаете рекурсивный вызов.В четном случае это работает для вашего условия прекращения, но не в нечетном случае.Тебе было бы лучше всего с помощью while
петли и вообще без рекурсии.
Вы можете обнаружить, что http://pythontutor.com/ помогает вам понять, что происходит.Ввод со степенью двойки прекратится, но вы увидите, что извлечение этих дополнительных кадров из стека занимает довольно много времени.