2016-03-24 8 views
0

I wurde für die Frage Projekt Euler arbeitet an einer Lösung # 4: „Finden Sie die größte Palindrom aus dem Produkt von zwei 3-stellige Zahlen gemacht“maximale Rekursionstiefe in Python-Klasse überschritten, Projekt Euler # 4

Ich könnte einfach ein grundlegendes Skript und eine Schleife schreiben, aber ich neige dazu, Dinge in Klassen zu schreiben.

Ich war eine Weile nicht mehr in Python, also benutze ich diese Übungen, um mit der Sprache vertraut zu bleiben.

Während durch die Faktoren Looping die Antwort herauszufinden, erhalte ich diese Fehlermeldung:

File "p4.py", line 35, in is_palindrome 
n = str(p) 
RuntimeError: maximum recursion depth exceeded while getting the str of an object 

Ich vermute, es die Art und Weise, das ich meine rekursive Methode formatiert, aber ich kann nicht herausfinden, wie sie zu beheben es.

Kann mir jemand erklären, was ich falsch mache, wenn ich meine rekursive Methode strukturiere?

Der Code:

import math 

class PalindromeCalculator: 

    def __init__(self, min_factor=100, max_factor=999): 
    self.stable_factor = max_factor 
    self.variable_factor = max_factor 

    def find_max_palindrome(self): 
    return self.check_next_product() 

    def check_next_product(self): 
    product = self.stable_factor * self.variable_factor; 
    if self.is_palindrome(product): 
     print("We found a palindrome! %s" % product) 
     return str(product) 
    else: 
     # Reduce one of the factors by 1 
     if self.variable_factor == 100: 
     self.variable_factor = 999 
     self.stable_factor -= 1 
     else: 
     self.variable_factor -= 1 

     self.check_next_product() 

    def is_palindrome(self, p): 
    # To check palindrom, pop and shift numbers off each side and check if they're equal 
    n = str(p) 
    length = len(n) 

    if length % 2 == 0: 
     iterations = length/2 
    else: 
     iterations = (length - 1)/2 

    for i in range(0, iterations): 
     first_char = n[i:i+1] 
     last_char = n[-(i+1)] 

     if first_char != last_char: 
     return False 

    return True 

und die Funktion auszuführen:

start = time.time() 
calculator = PalindromeCalculator(); 
M = calculator.find_max_palindrome() 
elapsed = (time.time() - start) 

print "My way: %s found in %s seconds" % (M, elapsed) 
+1

Nur ein kleiner Tippfehler, aber sehr schwer zu finden: Sie verwenden nie den 'min_factor' Parameter in Ihrem Konstruktor. –

Antwort

0

Dies ist vergleichbar mit einem StackOverflowError in Java. Weil check_next_product sich selbst so viel nennt, gibt es zu viele verschachtelte Funktionsaufrufe und Python hat es aufgegeben, sie alle im Auge zu behalten. Sie können das Rekursionslimit erhöhen, aber die Tatsache, dass die Rekursion so tief ist, zeigt, dass Sie eine iterative Lösung viel besser schreiben könnten. Rekursion ist für dieses Problem nicht wirklich geeignet.

Verwandte Themen