Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用python对象时超出了python最大递归深度_Python_Recursion - Fatal编程技术网

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

调用python对象时超出了python最大递归深度,python,recursion,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==1

所以,我制作了一个脚本,基本上是相加,然后将数字转换成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()

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


在您的代码中,有127个
first()
帧放在堆栈上,然后127**2
first()
second()
帧对放在堆栈上,然后127**3
first()
second()
third()
帧在堆栈展开之前放在堆栈上。这将提供总共2064639帧。

您超过了递归深度限制。要更改深度限制,请参见以下问题:。然而,即使这样也帮不了你,因为你打的电话数量非常大。在您的每个函数完成之前,它正在调用另一个(或自身),因此这就是使您的程序递归的原因。每次调用函数时,函数及其参数都会以帧的形式添加到计算机堆栈中。每次从函数返回时,帧都会从堆栈中移除。因此,当您在返回之前调用另一个函数时,堆栈深度(递归深度)增加了1。旁注:Python将在函数结束时自动返回
None
,即使您没有指定
return
语句

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

顺便说一句,不推荐使用全局变量,所以我为您更改了它

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 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个打印语句。

没有输入,并且错误很长。您是否尝试
打印ASCII值低于128的最多三个字符的每个组合?这是2113664个组合-递归是一个非常糟糕的方法选择。Python限制了递归调用的深度(默认为1000),因此出现了错误。“我得到了错误:调用Python对象时超过了最大递归深度。我根本不明白这意味着什么。”-你知道一个名为google.com的网站,在那里你可以在internet上搜索东西吗?因为您可以搜索准确的错误消息,并获得数千个解释它的结果。撇开讽刺不谈,我们希望人们在提出堆栈溢出问题之前做一些研究。提问前请使用谷歌和堆栈溢出搜索;你的错误绝非罕见,错误消息的含义已被大量记录在案。正如Jon所说,答案是不要使用递归,这在这里不合适。感谢你的帮助,当函数返回帧被清除时。它是语言的一部分,你无法控制它。这需要您改变解决问题的方式。我刚刚注意到letter1和letter2被设置为零,因此我的帧数太低。递归是指数增长的,因此它将是128^3,而不是128*3