2017-12-19 2 views
1

Ich versuche, die folgende Hausaufgabe zu entziffern. Mein Code soll 190 bewerten, wird aber stattdessen mit 114 bewertet. Ich glaube also nicht, dass ich die Codierungsanforderungen verstehe.Verstehen der Collatz-Vermutung Ziel in Python

Die Collatz-Vermutung ist ein Beispiel eines einfachen Rechenprozessverhaltens das ist so unberechenbar, dass die besten Mathematiker immer noch der Welt, die es nicht verstehen.

Betrachten wir die einfache Funktion f(n) (wie in der Seite Wikipedia definiert oben), die eine ganze Zahl n und teilt es durch zwei wenn n geradzahlig und Multiplikationen n von 3 und dann fügt man zu dem Ergebnis kommt, wenn n ungerade . Die Vermutung beinhaltet Untersuchung der Wert von Ausdrücken des Formulars f(f(f(...f(f(n))))) als die Anzahl der Aufrufe an die Funktion f erhöht. Die Vermutung ist, dass für jede nicht-negative ganze Zahl n, wiederholte Anwendung von f-n eine Folge von ganzen Zahlen ergibt, die immer 1.

Ihre Aufgabe für diese Frage enthält, ist die Collatz-Funktion f in Python zu implementieren . Der Schlüssel zu Ihrer Implementierung besteht darin, einen Test zu erstellen, der bestimmt, ob n gerade oder ungerade ist, indem Sie überprüfen, ob der Rest , wenn n durch 2 geteilt wird, entweder Null oder Eins ist. Hinweis: Sie können diesen Rest in Python mit dem Restoperator % über den Ausdruck n % 2 berechnen. Beachten Sie, dass Sie bei der Berechnung f auch die Ganzzahl division // verwenden müssen. Wenn Sie f implementiert haben, testen Sie die Implementierung auf dem Ausdruck f(f(f(f(f(f(f(674))))))). Dieser Ausdruck sollte bis 190 auswerten.

from __future__ import division 


def collatz(n): 
    l = [] 
    l.append(n) 
    while n != 1: 

     if n % 2 == 0: 
      n = n // 2 
      l.append(n) 

     else: 
      n = (3*n) + 1 
      l.append(n) 
    return l 


print len(collatz(674)) 
+0

Sie haben nicht umgesetzt 'f' aber eine ganz andere (wenn auch verwandte) Funktion. 'f' sollte nur den nächsten Term in der Sequenz berechnen, nicht die gesamte Sequenz. –

Antwort

2

Sie falsch verstanden nur die Vermittler Frage. Ihre Programme versuchen, die wichtigere Frage zu beantworten ... Das ist, was 190 zurückkehren soll:

def f(n): 
    return n // 2 if n % 2 == 0 else 3*n + 1 


print f(f(f(f(f(f(f(674))))))) 
+0

Danke Julien. Ich habs! – charlie