2016-04-27 12 views
1

Ich habe einen Code erstellt, der die Anzahl der Schritte misst, die erforderlich sind, um in einer Collatz Vermutung zu 1 zurückzukehren. Hier ist mein CodeZurücksetzen des Collatz-Zählers bei jeder neuen Rekursion

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

Ich erwarte, dass die letzten beiden Druckbefehle 311 und 311. Statt zu drucken, drucken sie 311 und 622. Ich denke, das war einfach genug, um den Code zu sehen, was falsch ist. Wie kann ich das beheben? Wie kann der Zähler jedes Mal zurückgesetzt werden, wenn ein Befehl abgeschlossen ist, und nicht, wenn die Funktion ausgeführt wird.

Antwort

4

Stattdessen globale Variable verwenden Sie könnten den Zähler einen Parameter mit Standardwert machen:

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

Das tat es. Vielen Dank! Gonna Mark als Ans ASAP –

1

Sie Rekursion verwenden, so ist es nur richtig nutzen:

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

Sie wurden global in Ihrer ursprünglichen Version verwenden, die ist in der Regel nicht, was Sie tun wollen. Du musst aus erster Hand sehen warum.

Sie könnte den Zähler zurückgesetzt haben, z.

result = counter 
counter = 0 
return result 

Aber das ist ziemlich böse, lass uns das nicht tun. Wenn Sie einen rekursiven Algorithmus implementieren, gibt es wahrscheinlich keinen guten Grund für eine globale Variable.

Verwandte Themen