繁体   English   中英

为什么我的Collat​​z序列代码执行但显示错误?

[英]Why does my Collatz sequence code execute but show error?

这是我在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

您执行a = collatz(a) ,但是由于您的函数没有return语句,因此将a设置为None。 然后,在循环的下一个迭代中,您尝试对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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM