我写了下面的递归程序来显示一个数在Collatz猜想中经过的步数:
def cycle_length(n):
count = 0
if n == 1:
return count
if n%2 == 0:
count += cycle_length(int(n/2)) +1
elif n%2 != 0:
count += cycle_length(int(3*n+1)) + 1
print("The count is: ",count)
return count
print(cycle_length(22))
然而,计数是15时,它应该是16。然而,当我改变初始计数为1或说:
return count + 1
它使计数加倍到31。我不知道是什么引起的。
谢谢你的帮助。
4条答案
按热度按时间toe950271#
当
n
为1时,需要将count
递增1才能返回。但是我认为如果您不选择计算第零步,那么您的代码在语法上是正确的。
参见http://oeis.org/A070165。
yvt65v4c2#
当你设置count=1时,你不应该在后面的if,else if语句中设置count+=。而且,在我看来,你之前的答案已经是正确的了。但是,如果你想在上面加1(即当1出现时计算步数),只需做以下操作:
bn31dyow3#
Collatz序列总是从给定的数字开始,因此基本情况应该是返回1
也就是说,你也可以使用迭代来计算它,因为python不太喜欢递归,例如,你的代码不能计算9780657631或75128138247而不得到递归错误
这是迭代版本
kzipqqlq4#
试试这个