为了账号安全,请及时绑定邮箱和手机立即绑定

Python:超过最大递归深度

Python:超过最大递归深度

哔哔one 2019-09-24 10:46:20
我有以下递归代码,在每个节点上我都调用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

...但是我建议您首先尝试优化代码,例如,使用迭代而不是递归。


查看完整回答
反对 回复 2019-09-24
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

因此Guido的观点是,正确的尾部调用(1)会提供较差的堆栈跟踪-而不是在迭代编写时根本没有帧?情况如何?(2)如果我们给他们一些好东西,他们可能会开始依赖它。(3)我不相信,它闻起来像Scheme。(4)Python设计错误,因此编译器无法有效地发现某些内容是否为尾调用。我猜我们可以达成共识吗?

查看完整回答
反对 回复 2019-09-24
?
温温酱

TA贡献1752条经验 获得超4个赞

第三,尾部调用肯定不仅仅用于列表。任何树形结构都会胜出。尝试遍历一棵树,而无需循环调用;您可以手动完成堆栈建模。最后,您关于Python从未以这种方式设计的观点确实是正确的,但并没有说服我这是上帝的设计。

查看完整回答
反对 回复 2019-09-24
  • 3 回答
  • 0 关注
  • 1079 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信