所以,我正在创建一个基本上加起来的脚本,然后将数字转换为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()
答案 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个打印语句。