2011-11-18 16 views
69

Ho il seguente codice di ricorsione, in ogni nodo che richiamo sql query per far sì che i nodi appartengano al nodo genitore.Python: superata profondità di ricorsione superata

qui è l'errore:

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 

metodo che io chiamo di ottenere risultati 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(); 

Io in realtà non hanno alcun problema con il metodo di cui sopra, ma ho messo comunque a dare una corretta panoramica della domanda.

Codice ricorsione:

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 

Chiamando la funzione ricorsiva

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(); 

codice per stampare il dizionario,

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

Se la ricorsione è troppo profonda dovrei ottenere l'errore quando chiamo la mia funzione di ricorsione, ma quando ottengo questo errore quando stampo il dizionario.

+7

Riscritlo iterativamente anziché ricorsivamente. –

+1

Il comando 'se prima:' è ridondante con 'per elem in primo:'. Se la query restituisce una lista di risultati vuota, quindi iterare su di essa semplicemente, correttamente non fare nulla, come desideri. Inoltre, è possibile creare tale lista più semplicemente con una comprensione di lista (e quei punti e virgola non sono necessari e generalmente considerati brutti :)) –

+0

@KarlKnechtel scusa per il punto e virgola, puoi dire che sto solo entrando in programmazione Python .... :) –

risposta

139

È possibile incrementare la profondità dello stack consentito - con questo, chiamate ricorsive più profondi sarà possibile, in questo modo:

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

... Ma vi consiglio di provare prima a ottimizzare il codice, per esempio, usando iterazione invece di ricorsione.

+0

Ricevo l'errore quando provo a stampare se il ricorsivo è troppo profondo Dovrei ricevere l'errore quando chiamo la mia funzione ricorsiva. Perché su tutta la linea chiamo questa funzione e salvo i risultati in un dizionario e quando provo a stampare quel dizionario ottengo questo errore. Ho aggiornato il codice. –

+0

Ho aggiunto la riga invece di 10000 ho aggiunto 30000 ma ho finito Segmentation Fault (core dumped) :( –

+4

Prova un numero più piccolo, quindi –