所以,我做了一个脚本,基本上是相加,然后把数字转换成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()
您超出了递归深度限制。要更改深度限制,请参阅以下问题:Python: Maximum recursion depth exceeded。但是,即使这样也帮不了你,因为你打电话的数量非常大。在你的每一个函数完成之前,它会调用另一个(或它自己),所以这就是使你的程序递归的原因。每次调用函数时,函数及其参数都以帧的形式添加到计算机堆栈中。每次从函数返回时,帧都会从堆栈中移除。所以,当您在返回之前调用另一个函数时,堆栈的深度(递归深度)增加了1。旁注:即使没有指定
return
语句,Python也会在函数末尾自动返回None
。在函数首先将递归深度设为128(大但仍起作用)。添加第二个函数会将深度增加到(128*128或16384)要完成此操作,必须增加递归深度。试试这段代码,当字母3第一次增加时,你会发现它停止了。根据您的计算机,它甚至可能无法达到字母3的第一次增加,这会让您知道您有多少函数调用(这非常适合本网站的标题,堆栈溢出)。在
顺便说一句,不建议使用全局变量,所以我为您更改了它。在
现在16384是第二个函数的深度。加上第三个,它(128*128*128或2097152)对于递归来说太大了。所以我建议你不要使用递归。尝试使用嵌套的
^{pr2}$for loops
。例如:请注意,这仍然需要一段时间,因为它正在生成128^3个打印语句。在
每次调用函数时,都会将一个帧添加到调用堆栈中,并且调用堆栈上的帧数是有限制的。当超过该限制时,会出现递归深度超出错误。在
在您的代码中,有127个}对帧放到堆栈上,然后在堆栈展开之前将127**3}三元组帧放到堆栈上。总共有2064639帧。在
first()
帧放在堆栈上,然后127**2first()
和{first()
、second()
和{相关问题 更多 >
编程相关推荐