2013-08-23 14 views
5

Ich übe Python mit Project Euler, Frage 1, aber die Funktion, die ich geschrieben habe, um es zu lösen, dauert viel zu lange.Funktion läuft zu langsam

Ich denke, es ist weil ich es nicht die eigentliche Methode selbst codiert habe.
Wenn ich diese Funktion mit 10 oder 15 Iterationen ausführe, spuckt sie sofort eine Antwort aus, aber sobald ich sie auf 20 hochspringe, zeigt sie mir selbst Minuten nichts mehr.
Dies ist offensichtlich ein großes Problem, wenn ich zu 1000 Iterationen gehen muss.

def pe1(n): 
    counter = 1 
    total = 0 
    while counter < n: 
     if counter%3==0: 
      total=total+counter 
     if counter%5==0: 
      if counter%3==0: 
       continue 
      total=total+counter 
     if counter % 25 == 0: 
      print (total) 
     counter=counter+1 
    return (total) 

Antwort

2

Betrachten wir den Fall, wenn counter 15 gleich und schauen, was passiert, wo counter%5==0 und counter%3==0, die zu diesem Zeitpunkt zuerst eintritt.

auch Bedenken Sie, was nicht für diesen Wert von counter passieren wird, kann die Linie counter=counter+1 nicht speziell ausgeführt.

6

Weil, sobald counter 15 schlägt, geht Ihre Schleife in eine unendliche continue - es wird immer die zweite if Aussage Fall zu treffen.

Sie müssen Ihre counter = counter + 1 Zeile vor dem Fortfahren verschieben, oder noch besser, verwenden Sie etwas wie for counter in range(1,n).

1

Um Fallen wie diese zu vermeiden, sollten Sie

if ... 
elif ... 
elif ... 
else ... 
0

verwenden, können Sie tabellengesteuert verwenden. So was.

counter_map = {3:fun1, 5:func2, 25:fun3} # key is remainder.Of course,fun can be replaced with lambda.