[英]Why does my Collatz sequence code execute but show error?
这是我在Collatz序列上的代码:
def collatz(a):
while (a != 1):
if a%2 == 0:
a = a//2
print (a, " -> ")
a = collatz(a)
elif a%2 != 0:
a = int(3*a + 1)
print (a, " -> ")
a = collatz(a)
x = int(input("Enter a number: "))
collatz(x)
对于每个输入的数字,我得到的输出都是完美的,但是Jupyter Notebook也显示出某种错误。 我在递归中犯了某种错误吗? 我已链接显示的输出和错误。
您执行a = collatz(a)
,但是由于您的函数没有return语句,因此将a
设置为None。 然后,在循环的下一个迭代中,您尝试对a进行算术运算。 这将失败,因为您无法对None进行算术运算。
您实际上根本不需要递归。 您已经有一个循环,因此您只需删除那些collatz调用即可。
def collatz(a):
while (a != 1):
if a%2 == 0:
a = a//2
print (a, " -> ")
elif a%2 != 0:
a = int(3*a + 1)
print (a, " -> ")
x = int(input("Enter a number: "))
collatz(x)
...但是,如果您对进行递归不满意,也可以这样做。 删除while循环,然后在函数末尾调用collatz
。
def collatz(a):
if a == 1:
return
if a%2 == 0:
a = a//2
elif a%2 != 0:
a = int(3*a + 1)
print (a, " -> ")
collatz(a)
这种方法的缺点是,如果函数递归超过999次,它将在“超过最大递归深度”时崩溃。 Collatz序列很快收敛到1,因此对于该特定算法来说这可能不是一个实际问题,但是在编写任何递归函数时要记住这一点。
这两种方法都具有在序列中最后一个数字之后打印“->”的潜在不良行为。 在这种“边打印边打印”代码样式中,这是一个相当普遍的问题。 一种可能的解决方案是从函数中删除打印调用,而不是返回序列值的列表。 然后,您可以在事实之后设置输出的样式,使用join
将带有箭头的数字插入其中。
def collatz(a):
result = [a]
while (a != 1):
if a%2 == 0:
a = a//2
elif a%2 != 0:
a = int(3*a + 1)
result.append(a)
return result
x = int(input("Enter a number: "))
seq = collatz(x)
print(" -> ".join(str(num) for num in seq))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.