调用Python对象时超出了python的最大递归深度

时间:2014-09-29 15:06:08

标签: python recursion

所以,我正在创建一个基本上加起来的脚本,然后将数字转换为ascii。它有点工作,但经过一段时间的运行我得到错误:调用Python对象时超出了最大递归深度。我完全不明白这意味着什么...这是我的代码:

letter1=0
letter2=0
letter3=0
def first():
    global letter1
    letter1+=1
    print(chr(letter1), chr(letter2), chr(letter3))
    if letter1==127:
        second()
    else:
        first()
def second():
    global letter1
    global letter2
    letter2+=1
    print(chr(letter1), chr(letter2), chr(letter3))
    letter1=0
    if letter2==127:
        third()
    else:
        first()
def third():
    global letter1
    global letter2
    global letter3
    letter1=0
    letter2=0
    letter3+=1
    print(chr(letter1), chr(letter3), chr(letter3))
    if letter3==127:
        print("\n\n\n\n\n\n\n\n\n\n")
    else:
        first()
first()

2 个答案:

答案 0 :(得分:1)

每次调用函数时,帧都会被添加到调用堆栈中,并且调用堆栈上的帧数有限制。超过该限制时,会超出递归深度错误。

在您的代码中,堆栈上放置了127个first()帧,然后堆叠了127 ** 2 first()second()个帧,然后127 ** 3在堆栈展开之前,堆栈中放置了first()second()third()个三元组。这总共提供了2064639帧。

答案 1 :(得分:1)

您超出了递归深度限制。要更改深度限制,请参阅此问题:Python: Maximum recursion depth exceeded。但是,即使这样也无济于事,因为您拨打的电话数量非常大。在每个函数完成之前,它会调用另一个函数(或者它自己),这就是使程序递归的原因。每次调用函数时,函数及其参数都以帧的形式添加到计算机的堆栈中。每次从函数返回时,帧都会从堆栈中删除。因此,当您在返回之前调用另一个函数时,您已经将堆栈的深度(递归深度)增加了1.旁注:即使您执行了函数,Python也会在函数结束时自动返回None不指定return语句。

该函数首先使您的递归深度为128(大但仍然有效)。添加第二个函数会将深度增加到(128 * 128或16384),以便完成此操作,您必须增加递归深度。试试这段代码,当letter3首次增加时你会发现它停止了。根据你的计算机,它甚至可能没有达到letter3的第一次增加,这会让你知道你有多少函数调用(这非常适合这个网站的标题,堆栈溢出)。

不建议使用全局变量,所以我为你改了。

import sys
sys.setrecursionlimit(16385)

def first(letter1, letter2, letter3):
    letter1+=1
    print(chr(letter1), chr(letter2), chr(letter3))
    if letter1==127:
        second(letter1, letter2, letter3)
    else:
        first(letter1, letter2, letter3)

def second(letter1, letter2, letter3):
    letter2+=1
    print(chr(letter1), chr(letter2), chr(letter3))
    letter1=0
    if letter2==127:
        third(letter1, letter2, letter3)
    else:
        first(letter1, letter2, letter3)

def third(letter1, letter2, letter3):
    letter1=0
    letter2=0
    letter3+=1
    print(chr(letter1), chr(letter3), chr(letter3))
    if letter3==127:
        print("\n\n\n\n\n\n\n\n\n\n")
    else:
        first(letter1, letter2, letter3)

letter1=0
letter2=0
letter3=0
first(letter1, letter2, letter3)

现在16384只是第二个功能的深度。添加第三个使得它(128 * 128 * 128或2097152)对于递归来说太大了。所以我建议解决你的问题是不使用递归。请尝试嵌套for loops。例如:

for letter3 in range(128):
    for letter2 in range(128):
        for letter1 in range(128):
            print(chr(letter1), chr(letter2), chr(letter3))
print("completed")

请注意,这仍需要一段时间,因为它会生成128 ^ 3个打印语句。