2016-04-27 50 views
1

我做了一个代码,测量在Collatz猜想中返回1所需的步骤数。这里是我的代码重置Collat​​z计数器每个新的递归

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。我想这是很容易的代码是什么错误,看看。我该如何解决这个问题?如何在每次命令完成时计数器复位,而不是在函数运行时复位。

回答

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) 
+0

这做到了。谢谢!要尽快标记为答案 –

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 

但是,这是非常讨厌的,让我们不要那样做。当你实现一个递归算法时,可能没有理由有一个全局变量。