Python:超过最大递归深度

我有以下递归代码,在每个节点上我都调用sql查询来获取属于父节点的节点。


这是错误:


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

我调用以获得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;


如果递归太深,则在调用递归函数时会出现错误,但是在打印字典时出现此错误。


哔哔one
浏览 1080回答 3
3回答

慕码人2483693

您可以增加允许的堆栈深度-这样,将可以进行更深层的递归调用,如下所示:import syssys.setrecursionlimit(10000) # 10000 is an example, try with different values...但是我建议您首先尝试优化代码,例如,使用迭代而不是递归。

子衿沉夜

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

温温酱

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

相关分类

Python