在每次新递归时重置Collat​​z计数器

时间:2016-04-27 15:09:19

标签: python python-3.x

我制作了一个代码,用于衡量在Collatz猜想中返回1所需的步骤数。这是我的代码

counter = 0
def collatz(n):
    global counter 
    counter += 1
    if n <= 0 :
        return "Invalid Number"
    elif n == 1 :
        return counter
    elif n % 2 == 1 :
        n = 3*n + 1
        return collatz(n)
    elif n % 2 == 0 :
        n = n/2
        return collatz(n)   
print(collatz(9921615699))
print(collatz(9921615699))

我希望最后两个打印命令打印311和311.相反,它们打印311和622.我想这很容易在代码中看到什么是错的。我该如何解决这个问题?每次命令完成时如何计数器复位,而不是在运行函数时。

2 个答案:

答案 0 :(得分:4)

您可以使计数器成为具有默认值的参数,而不是使用全局变量:

def collatz(n, counter=0):
    counter += 1
    if n <= 0 :
        return "Invalid Number"
    elif n == 1 :
        return counter
    elif n % 2 == 1 :
        n = 3*n + 1
        return collatz(n, counter)
    elif n % 2 == 0 :
        n = n/2
        return collatz(n, counter)

答案 1 :(得分:1)

你正在使用递归,所以只需正确使用它:

def collatz(n, counter=0):
    counter += 1
    if n <= 0 :
        return "Invalid Number"
    elif n == 1 :
        return counter
    elif n % 2 == 1 :
        n = 3*n + 1
        return collatz(n, counter)
    elif n % 2 == 0 :
        n = n/2
        return collatz(n, counter)   
print(collatz(9921615699))
print(collatz(9921615699))

您在原始版本中使用global 通常而不是您想要做的事情。你必须亲眼看到原因。

可以重置计数器,例如

result = counter
counter = 0
return result

但那非常令人讨厌,我们不这样做。当您实现递归算法时,可能没有充分理由拥有全局变量。