调用python对象时超出了python最大递归深度
所以,我制作了一个脚本,基本上是相加,然后将数字转换成ascii。它可以工作一点,但运行一段时间后,我得到了一个错误:调用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
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**2first()
和second()
帧对放在堆栈上,然后127**3first()
,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