Пока l oop не ломается, когда должно - PullRequest
1 голос
/ 28 апреля 2020

Я просто писал небольшую python программу для запуска алгоритма Коллатца, и я думаю, что пока l oop не сломается, когда должно. Я использую этот VSCode 1.44.2 и Python 3.7.5 64bit

def collatz(n):
    while n != 1.0:
        if n%2 == 0:
            n = n/2
        else:
            n = 3*n+1
        print(n)
        collatz(n)

collatz(3)

и вот полный вывод

10
5.0
16.0
8.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
8.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
16.0
8.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
8.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
5.0
16.0
8.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
8.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
16.0
8.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
8.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0

На этом этапе программа завершилась без ошибка. Когда я прохожу программу, я вижу сообщение «(возвращение) collatz: None», когда n = 1,0, и следующий шаг отладчика снова переходит в начало while l oop. Почему на этом этапе программа не заканчивается? Поскольку он не заканчивается, когда n = 1, почему он в конце концов заканчивается и не работает вечно?

1 Ответ

2 голосов
/ 28 апреля 2020

Ваш l oop повторяется только после того, как n достигнет 1, потому что ваша функция вызывает себя рекурсивно, в строке, которую я отметил ниже:

def collatz(n):
    while n != 1.0:
        if n%2 == 0:
            n = n/2
        else:
            n = 3*n+1
        print(n)
        # recursive call here
        collatz(n)

Поскольку ваша функция вызывает себя рекурсивно, затем, когда n достигает 1, while l oop завершается, но это только означает, что текущий рекурсивный вызов возвращается, а затем тот, который находится ниже его в стеке, возобновляется, выполняя дополнительную печать.

Чтобы исправить проблема, вы должны использовать только while l oop или просто рекурсию, а не оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...