【问题标题】:Why does my Collatz sequence code execute but show error?为什么我的 Collat​​z 序列代码执行但显示错误?
【发布时间】:2019-01-17 13:32:55
【问题描述】:

这是我在 Collat​​z 序列上的代码:

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 也显示了某种错误。我在递归中犯了某种错误吗?我已经链接了输出和显示的错误。

https://ibb.co/C1jCthq

【问题讨论】:

  • 请正确缩进代码
  • 请将错误显示为文本,而不是屏幕截图。我无法搜索屏幕截图。

标签: python recursion collatz


【解决方案1】:

您使用a = collatz(a),但由于您的函数没有返回语句,这会将a 设置为无。然后在循环的下一次迭代中,您尝试对 a 进行算术运算。这失败了,因为你不能在 None 上做算术。

这里根本不需要递归。您已经有了一个循环,因此您可以简单地删除这些 collat​​z 调用。

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 次,它会因“超出最大递归深度”而崩溃。 Collat​​z 序列很快收敛到 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))

【讨论】:

  • 谢谢。如果我想在一行中打印输出,例如 3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1,而不是在不同的行上打印每个数字,我该怎么办?
  • print 自动在输出末尾添加换行符,但您可以禁止这种行为:在 3.X 中,提供 end 参数,例如。 print (a, " -> ", end="")。在 2.7 中,以逗号结束打印语句,例如。 print a, " -> ",
猜你喜欢
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
相关资源
最近更新 更多