Python Collatz Infinite Loop - PullRequest
       39

Python Collatz Infinite Loop

0 голосов
/ 03 марта 2019

Извиняюсь, если были заданы похожие вопросы, но я не смог найти ничего, что могло бы решить мою проблему.Я написал простой фрагмент кода для последовательности Коллатца в Python, который, кажется, отлично работает для четных чисел, но застревает в бесконечном цикле, когда вводится нечетное число.

Я не смогвыяснить, почему это или способ вырваться из этого цикла, поэтому любая помощь будет очень признательна.

print ('Enter a positive integer')
number = (int(input()))

def collatz(number):
    while number !=1:
        if number % 2 == 0:
            number = number/2
            print (number)
            collatz(number)
        elif number % 2 == 1:
            number = 3*number+1
            print (number)
            collatz(number)

collatz(number)

1 Ответ

0 голосов
/ 03 марта 2019

В вашей функции отсутствуют какие-либо операторы return, поэтому по умолчанию она возвращает None.Возможно, вы захотите определить функцию, чтобы она возвращала количество шагов от 1 от введенного числа.Вы можете даже кэшировать таких результатов.

Вы, кажется, хотите сделать рекурсивный вызов, но вы также используете цикл while.Выберите одно или другое.

При повторении вы не можете иметь для переназначения переменной, вы можете выбрать выражение в вызове, например:

    if number % 2 == 0:
        collatz(number / 2)
    elif ...

Это приносит нам суть дела.В ходе рекурсии вы создали много стековых фреймов, каждый из которых имеет свою собственную закрытую переменную с именем number и содержит различные значения.Вы вводите себя в заблуждение, изменяя number в текущем кадре стека, и , копируя его в кадр следующего уровня, когда вы делаете рекурсивный вызов.В четном случае это работает для вашего условия прекращения, но не в нечетном случае.Тебе было бы лучше всего с помощью while петли и вообще без рекурсии.

Вы можете обнаружить, что http://pythontutor.com/ помогает вам понять, что происходит.Ввод со степенью двойки прекратится, но вы увидите, что извлечение этих дополнительных кадров из стека занимает довольно много времени.

execution trace

...