如果有人提出类似的问题但我无法找到解决问题的方法,我会道歉。我已经为Python中的Collatz 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)
您的函数缺少任何return
语句,因此默认情况下它返回None
。您可能希望定义该函数,以便返回输入数字与1
相差多少步。你甚至可能选择cache这样的结果。
你似乎想要进行递归调用,但你也使用while
循环。选择一个或另一个。
在递归时,您不必重新分配变量,您可以选择将表达式放入调用中,如下所示:
if number % 2 == 0:
collatz(number / 2)
elif ...
这给我们带来了问题的关键。在递归过程中,您创建了许多堆栈帧,每个堆栈帧都有自己的私有变量number
并包含不同的值。您通过更改当前堆栈帧中的number
并在进行递归调用时将其复制到下一级帧来混淆自己。在偶数情况下,这适用于您的终止条款,但不是在奇数情况下。你只需要一个while
循环并且根本没有递归就会更好。
您可能会发现http://pythontutor.com/可以帮助您了解正在发生的事情。两个幂的输入将终止,但你会发现从堆栈中弹出那些额外的帧需要很长时间。