Python Collat z无限循环

问题描述 投票:-1回答:1

如果有人提出类似的问题但我无法找到解决问题的方法,我会道歉。我已经为Python中的Collat​​z Sequence编写了一段简单的代码,它似乎对偶数工作正常但在输入奇数时会陷入无限循环。

我无法弄清楚为什么这是一种突破这种循环的方式,所以任何帮助都会非常感激。

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)
python-3.x infinite-loop
1个回答
0
投票

您的函数缺少任何return语句,因此默认情况下它返回None。您可能希望定义该函数,以便返回输入数字与1相差多少步。你甚至可能选择cache这样的结果。

你似乎想要进行递归调用,但你也使用while循环。选择一个或另一个。

在递归时,您不必重新分配变量,您可以选择将表达式放入调用中,如下所示:

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

这给我们带来了问题的关键。在递归过程中,您创建了许多堆栈帧,每个堆栈帧都有自己的私有变量number并包含不同的值。您通过更改当前堆栈帧中的number并在进行递归调用时将其复制到下一级帧来混淆自己。在偶数情况下,这适用于您的终止条款,但不是在奇数情况下。你只需要一个while循环并且根本没有递归就会更好。

您可能会发现http://pythontutor.com/可以帮助您了解正在发生的事情。两个幂的输入将终止,但你会发现从堆栈中弹出那些额外的帧需要很长时间。

execution trace

© www.soinside.com 2019 - 2024. All rights reserved.