我有以下递归代码,在每个节点上我都调用sql查询来获取属于父节点的节点。这是错误:Exception RuntimeError: 'maximum recursion depth exceeded' in <bound method DictCursor.__del__ of <MySQLdb.cursors.DictCursor object at 0x879768c>> ignoredRuntimeError: maximum recursion depth exceeded while calling a Python objectException AttributeError: "'DictCursor' object has no attribute 'connection'" in <bound method DictCursor.__del__ of <MySQLdb.cursors.DictCursor object at 0x879776c>> ignored我调用以获得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();我实际上对上述方法没有任何问题,但是我还是把它放在了问题的适当位置。递归代码: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调用递归函数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;如果递归太深,则在调用递归函数时会出现错误,但是在打印字典时出现此错误。
3 回答
慕码人2483693
TA贡献1860条经验 获得超9个赞
您可以增加允许的堆栈深度-这样,将可以进行更深层的递归调用,如下所示:
import sys
sys.setrecursionlimit(10000) # 10000 is an example, try with different values
...但是我建议您首先尝试优化代码,例如,使用迭代而不是递归。
子衿沉夜
TA贡献1828条经验 获得超3个赞
因此Guido的观点是,正确的尾部调用(1)会提供较差的堆栈跟踪-而不是在迭代编写时根本没有帧?情况如何?(2)如果我们给他们一些好东西,他们可能会开始依赖它。(3)我不相信,它闻起来像Scheme。(4)Python设计错误,因此编译器无法有效地发现某些内容是否为尾调用。我猜我们可以达成共识吗?
温温酱
TA贡献1752条经验 获得超4个赞
第三,尾部调用肯定不仅仅用于列表。任何树形结构都会胜出。尝试遍历一棵树,而无需循环调用;您可以手动完成堆栈建模。最后,您关于Python从未以这种方式设计的观点确实是正确的,但并没有说服我这是上帝的设计。
添加回答
举报
0/150
提交
取消