2011-11-18 22 views
69

Tengo el siguiente código de recursión, en cada nodo al que llamo sql query para que los nodos pertenezcan al nodo padre.Python: Profundidad de recursión máxima excedida

aquí es el error:

Exception RuntimeError: 'maximum recursion depth exceeded' in <bound method DictCursor.__del__ of <MySQLdb.cursors.DictCursor object at 0x879768c>> ignored 

RuntimeError: maximum recursion depth exceeded while calling a Python object 
Exception AttributeError: "'DictCursor' object has no attribute 'connection'" in <bound method DictCursor.__del__ of <MySQLdb.cursors.DictCursor object at 0x879776c>> ignored 

método que llamo para obtener resultados sql:

def returnCategoryQuery(query, variables={}): 
    cursor = db.cursor(cursors.DictCursor); 
    catResults = []; 
    try: 
     cursor.execute(query, variables); 
     for categoryRow in cursor.fetchall(): 
      catResults.append(categoryRow['cl_to']); 
     return catResults; 
    except Exception, e: 
     traceback.print_exc(); 

En realidad no tiene ningún problema con el método anterior, pero de todos modos lo ponen a dar una visión general adecuada de la pregunta.

Código de recursividad:

def leaves(first, path=[]): 
    if first: 
     for elem in first: 
      if elem.lower() != 'someString'.lower(): 
       if elem not in path: 
        queryVariable = {'title': elem} 
        for sublist in leaves(returnCategoryQuery(categoryQuery, variables=queryVariable)): 
         path.append(sublist) 
         yield sublist 
        yield elem 

Llamar a la función recursiva

for key, value in idTitleDictionary.iteritems(): 
    for startCategory in value[0]: 
     print startCategory + " ==== Start Category"; 
     categoryResults = []; 
     try: 
      categoryRow = ""; 
      baseCategoryTree[startCategory] = []; 
      #print categoryQuery % {'title': startCategory}; 
      cursor.execute(categoryQuery, {'title': startCategory}); 
      done = False; 
      while not done: 
       categoryRow = cursor.fetchone(); 
       if not categoryRow: 
        done = True; 
        continue; 
       rowValue = categoryRow['cl_to']; 
       categoryResults.append(rowValue); 
     except Exception, e: 
      traceback.print_exc(); 
     try: 
      print "Printing depth " + str(depth); 
      baseCategoryTree[startCategory].append(leaves(categoryResults)) 
     except Exception, e: 
      traceback.print_exc(); 

código para imprimir el diccionario,

print "---Printing-------" 
for key, value in baseCategoryTree.iteritems(): 
    print key, 
    for elem in value[0]: 
     print elem + ','; 
    raw_input("Press Enter to continue...") 
    print 

Si la recursividad es demasiado profunda que debería llegar el error cuando llamo a mi función de recursión, pero cuando obtengo este error cuando imprimo el diccionario.

+7

Reescriba iterativamente en lugar de recursivamente. –

+1

La verificación 'if first:' es redundante con 'para elem in first:'. Si la consulta devuelve una lista de resultados vacía, iterar sobre ella simplemente, correctamente no hará nada, como lo desee. Además, puedes crear esa lista de forma más simple con una lista de comprensión (y esos puntos y comas son innecesarios y generalmente se consideran feos :)) –

+0

@KarlKnechtel, disculpa por los puntos y comas, ¿puedes decir que acabo de entrar en la programación de Python ... :) –

Respuesta

139

puede incrementar la profundidad de la pila permitido - con esto, las llamadas recursivas más profundas serán posibles, así:

import sys 
sys.setrecursionlimit(10000) # 10000 is an example, try with different values 

... Pero te aconsejo que primero pruebe a optimizar el código, por instancia, usando iteración en lugar de recursión.

+0

Recibo el error cuando intento imprimir si el recursivo es demasiado profundo Debería estar recibiendo el error cuando llamo a mi función recursiva Porque en la línea llamo a esta función y guardo los resultados en un diccionario y cuando trato de imprimir ese diccionario me sale este error. He actualizado el código. –

+0

Agregué la línea en lugar de 10000 Agregué 30000 pero terminé la falla de segmentación (núcleo objeto de dumping) :( –

+4

Probé un número más pequeño, luego –

Cuestiones relacionadas