2017-12-30 44 views
1

Hinweis: Ich habe versucht herauszufinden, warum meine while-Anweisung nicht als False ausgewertet wurde, wenn die Ganzzahl war. Daher glaube ich nicht, dass es sich um ein DuplikatWhile-Schleife bricht nicht ab, obwohl die Bedingung erfüllt ist (Collatz Sequence)

handelt

Doing eine Automatisierung der langweiligen Sachen Übung in Python, wo das Programm eine Eingabe erhält und reduziert es auf 1 mit dem folgenden Algorithmus.

#even/2 
#odd * 3 + 1 


def collatz(): 
    print("Enter number:") 
    number = input() 
    try: 
     data = int(number) # Input Validation 

     while int(data) != 1: 
      if data % 2 == 0: #Number is even 
       data = int(data/2) 
       print(data) 
      if data % 2 == 1: # Number is odd 
       data = int(3*data+1) 
       print(data) 

    except: 
     print("Please input a valid value") 
     collatz() 

collatz() 

Anstelle der while-Schleife Zerbrechen, wenn die Anzahl auf 1 läuft die Schleife weiter reduziert wird, und es multipliziert 1 mit 3 und addiert 1 (genauso wie normale ungerade Zahl). Btw viele Int-Konvertierungen wurden gemacht, da ich dachte, dass es einen Fließkommawert zurückgegeben hat.

Also bitte sagen Sie mir, wo sind die unnötigen Int-Konvertierungen und wie man es mit einer while-Anweisung zu brechen. Jede Bereinigung Code geschätzt wird

Antwort

2

Es gibt ein paar Dinge, die Sie neaten sollten Sie den Code richtig funktionieren und nur allgemein besser zu machen:

  • Rename data zu n, das wird nicht viel machen von einem Unterschied, aber ich würde sagen, es macht nur mehr Sinn.
  • Es besteht keine Notwendigkeit endlose Konvertierungen int zu tun, n braucht nur von einem string zu einem integereinmal umgewandelt werden.
  • Setzen Sie nicht Ihren gesamten Code in eine function dann rufen Sie es einmal, stattdessen haben Sie den Hauptalgorithmus in einem kleineren function, die Sie dann aus dem Hauptteil Ihres Codes aufrufen oder sogar function erstellen können, um den Algorithmus aufzurufen, der behandelt die Eingabeseite der Dinge.
  • die Integer-Division Operator (//) anstelle des Gleitkomma-Teiler (/), da die Anzahl sogar sein wird, können Sie sicher sein, dass die Dezimalstelle 0 sein wird.
  • Sie brauchen nicht zu prüfen, ob n % 20 ist und dann auf dem Scheck nächsten Zeile, wenn es n % 21 ist, können Sie nur eine if ... else-Klausel verwenden.

Und das war's! Hier ist, wie es aussieht:

#even/2 
#odd * 3 + 1 

def collatz(n): 
    while n != 1: 
     if n % 2 == 0: #Number is even 
      n = n // 2 
     else: 
      n = n * 3 + 1 
     print(n) 

number = input("Enter number:") 

try: 
    number = int(number) 
    collatz(number) 
except ValueError: 
    print("Please input a valid value") 

Und ein Test zeigt, es funktioniert (Eingang von 24):

12 
6 
3 
10 
5 
16 
8 
4 
2 
1 
+0

Vielen Dank für alle Tipps und Verbesserungen! Wenn ich den ganzen Code in einer Funktion belassen würde, warum brach meine while-Schleife nicht, wenn n oder in meinem Fall Daten 1 waren? –

+0

@KOOTSHOOTS Verstanden! Das liegt daran, dass Sie zwei "if" -Anweisungen machen, also würde der Fall, in dem 'data'' 2' war, den ersten Test bestehen und durch '2' dividieren, um' 1' zu bekommen, aber dann würde der zweite 'if' Sehen Sie, es war jetzt seltsam und halten Sie es durch Multiplizieren mit "3" und Hinzufügen von "1". Deshalb funktioniert meine Funktion, weil ich ein "else" benutzt habe. **:) ** Bitte akzeptieren Sie dann! –

Verwandte Themen