2017-06-08 3 views
2

Ich habe ein Problem mit Schleifen und deklarieren Variablen. Momentan mache ich ein Programm über Collatz Conjecture, das Programm sollte prüfen, was die größten Schritte sind, um eine bestimmte Menge von Collatz Sequence zu erreichen. hier ist mein Code:Schleifen und Collatz-Vermutung

start_num = int(input("insert a starting Number > ")) 
how_many = int(input("how many times you want to check? >")) 


def even_or_odd(number): 
    if number % 2 == 0: 
     return 'isEven' 
    else: 
     return 'notEven' 


def collatz(n): 
    z = n 
    counter = 0 
    while True: 
     if n != 1: 
      if even_or_odd(n) == 'isEven': 
       n = n/2 
       counter += 1 
       continue 
      if even_or_odd(n) == 'notEven': 
       n = (n*3)+1 
       counter += 1 
       continue 
     else: 
      print('number ' + str(z) + ' reached 1 with : ' + str(counter) + ' steps') 
      return counter 
      break 


def check_biggest_steps(steps_before, steps_after): 
    if steps_before > steps_after: 
     return steps_before 
    if steps_after > steps_before: 
     return steps_after 
    if steps_after == steps_before: 
     return steps_after 


def compute_collatz(n_times, collatz_number): 
    for _ in range(n_times): 
     before = collatz(collatz_number) 
     collatz_number += 1 
     after = collatz(collatz_number) 
     collatz_number += 1 
     biggest_steps = check_biggest_steps(before, after) 

    print('Biggest Steps is :' + str(biggest_steps)) 


compute_collatz(how_many, start_num) 

diese biggest_steps Variable, die die letzten 2 Schritte immer wieder zurückkehren. Ich weiß, was dieses Problem verursacht, ist, dass biggest_step Variable innerhalb der Schleife befindet, aber ich kann es nicht überall funktionieren, weiß nicht, was zu tun ist. Danke

+2

Ihre 'even_or_odd'-Funktion ist eher .. gut, seltsam. Es wäre normaler, es "even" oder vielleicht "is_even" zu nennen, und es würde entweder "True" oder "False" zurückgeben, so dass der aufrufende Code 'if is_even (n):'. Und wenn Sie es so machen, ist es ein One-Liner - keine Notwendigkeit für die "if" -Anweisung, nur 'return not n% 2' - also können Sie entscheiden, die Funktion zu beseitigen, und nur * das * Bedingung verwenden in 'collage'. Auf ähnliche Weise können Sie die gesamte 'check_biggest_steps'-Funktion durch' max (before, after) 'ersetzen. – lvc

Antwort

1

Lesen Sie meinen Code nicht, bis Sie es selbst versucht haben.

Versuchen Sie, eine Liste zu erstellen, die jede Änderung an eine Liste anfügt, um dann die Anzahl der Züge am Ende zu erhalten, erhalten Sie einfach die Länge der Liste.

.

def collatz(x): 
    while x != 1: 
     if x % 2 > 0: 
      x =((3 * x) + 1) 
      list_.append(x) 
     else: 
      x = (x/2) 
      list_.append(x) 
    return list_ 


print('Please enter a number: ', end='') 
while True: 
    try: 
     x = int(input()) 
     list_ = [x] 
     break 
    except ValueError: 
     print('Invaid selection, try again: ', end='') 


l = collatz(x) 

print('\nList:', l, sep=' ') 
print('Number of steps required:', len(l) - 1) 
+1

ok Ich habe betrogen und sehe deinen Code an. eigentlich kam mir diese Ausnahmebehandlung gerade in den Sinn, nachdem ich dies gepostet habe (ja, ich schreibe dies, kurz nachdem ich aufgewacht bin), und ich merke nicht einmal, dass "Liste" ein so gutes Werkzeug dafür ist. Danke ! – Wowotek

+0

Kein Problem, schauen Sie sich den Code noch einmal an, ich habe ihn ein wenig aufgeräumt. – Rosh

+0

Wtf, das ist schrecklich - OP hatte eine gute Idee, nur die Länge der Sequenz zu behalten - verwendet nur log (len (list_)) des Speichers. Und die Verwendung globaler Variablen wird dich später hart treffen. – enedil

1

Sie haben nicht Ihre größten_Schritte gespeichert und verglichen immer nur die letzten 2.

Ich würde folgende Änderung vorschlagen.

def compute_collatz(n_times, collatz_number): 
    biggest_steps = 0 
    for _ in range(n_times): 
     steps = collatz(collatz_number) 
     if steps > biggest_steps: 
      biggest_steps = steps 
     collatz_number += 1 

    print('Biggest Steps is :' + str(biggest_steps)) 
+0

das wäre falsch. Diese Schritte würden stattdessen die Collatz-Nummer haben. – Wowotek