2016-08-04 8 views
0

Ich erhalte eine "maximale Rekursion Tiefe überschritten" Fehler bei der Ausführung meines Programms, um dieses Problem zu lösen. Projekt Eulers question #5 fragt zu finden:RekursionError im Projekt Euler # 5

Die kleinste positive Zahl, die durch alle Zahlen von 1 bis 10.

I teilbar ist habe versucht, ein Programm zu schreiben, die rekursiv überprüft, ob x ist teilbar durch jede ganze Zahl 1-10, und wenn es nicht dann wir rufen es wieder mit x erhöht um 1 und wiederholen, bis x gefunden wird. (In diesem Fall ist die Antwort 2520, weshalb ich die if-Anweisung hinzugefügt.)

def euler5(x): 

    if x < 2521: 
     for i in range(1, 11): 
      if x % i == 0: 
       print(x) 

      else: 
       euler5(x+1) 

    else: 
     print(x) 


x = 2 
print(euler5(x)) 
+6

Warum Sie Rekursion verwenden und nicht eine Schleife? – Blorgbeard

+5

Wenn Sie bereits die Antwort wissen, warum benötigen Sie den Code? :) In aller Ernsthaftigkeit soll der Code jedoch ohne Limit-Check funktionieren, das ist die Idee des Problems - die Nummer –

Antwort

4

Der Grund dafür ist, dass Python (oder CPython zumindest) eine begrenzte Stapelgröße und keinen Schwanz Call-Optimierung hat. Sie können also keine unbegrenzte Rekursion in Python verwenden, im Gegensatz zu Scheme (zum Beispiel).

Die Lösung ist eine regelmäßige Schleife zu verwenden:

x = 0 
while True: 
    x += 1 
    # Put loop body here 
-1

In Sie Funktion definiert, Sie könnten Sie eine Schleife, auch wenn Sie nicht wissen, mathematische Funktionen. Ihr Code ist jedoch nicht effizient, da das Programm die Werte überprüfen muss, um zu sehen, ob es mit der Bedingung übereinstimmt. Rekursion wird nicht empfohlen, da es flexibel sein sollte, um mit anderen Werten nicht nur für diese Frage verwendet zu werden. Euler-Fragen sollen Ihre Programmierpraktiken trainieren.

Eine bessere Methode kann der Code verwendet werden, um zu vereinfachen:

für diese
from functools import reduce 
from fractions import gcd 
def lcm(a,b): 
    return a*b//gcd(a,b) #gcd is greatest common divisor AKA HCF 

print (reduce(lcm, range(1, 20+1))) 
+1

zu finden Denkst du nicht, das Problem mit dem Code zu erklären, ist besser als eine optimale Antwort zu geben? –

+1

Das könnte enthalten sein. Lassen Sie mich meinen Beitrag bearbeiten –

+1

Ich werde argumentieren, dass Euler-Probleme dazu gedacht sind, mathematisches Wissen zu testen, nicht unbedingt Code-Praxis. Zum Beispiel wird ein Vielfaches von 2 benötigt, so dass Sie nicht einzelne Ziffern durchlaufen müssen. Auch nicht jede zweite Ziffer, weil ein Vielfaches von 5 benötigt wird. Ähnliche Tests können für andere Ziffern ausgeführt werden. Das erhöht die Geschwindigkeit des Codes erheblich. –