2016-04-27 45 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 

但是,這是非常討厭的,讓我們不要那樣做。當你實現一個遞歸算法時,可能沒有理由有一個全局變量。