2014-09-29 98 views
-3

所以,我正在制作一个基本合起来的脚本,然后将数字转换为ascii。它工作一点点,但经过一段时间的运行,我得到的错误:调用Python对象时超出最大递归深度。我不明白这是什么意思在所有...这里是我的代码:python调用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

没有输入,错误非常长 – user3556962 2014-09-29 15:12:01

+0

您是否想要打印每个ASCII码值低于128的字符?这是2,113,664种组合 - 递归是一种非常差的方法选择。 Python限制递归调用的深度(默认为1,000),因此会出现错误。 – jonrsharpe 2014-09-29 15:13:55

+0

“我得到错误:调用Python对象时超出了最大递归深度,我完全不明白它的意思。” - 您是否知道一个名为google.com的网站,您可以在网上搜索这些内容?因为您可以搜索确切的错误消息并获得解释它的数千个结果。除了讽刺之外,我们希望人们在提出Stack Overflow问题之前做一些研究。在提出问题之前,请使用谷歌和堆栈溢出搜索;你的错误绝非罕见,它广泛地记录了你的错误信息的含义。 – l4mpi 2014-09-29 15:26:32

回答

0

每次调用一个函数的框架被添加到调用堆栈,并且是有一定限度对帧数调用堆栈。当超过这个限制时,你会得到递归深度超出的错误。

在你的代码有进入堆叠127个first()帧,然后127 ** 2 first()second()双把堆栈帧,然后127 ** 3 first()second()和框架的third()三胞胎穿上堆栈之前的堆栈展开。这总共提供了2064639帧。

+0

那么我怎么去清除帧? – user3556962 2014-09-29 15:17:33

+1

正如乔恩所说,答案不是使用递归,这里不适合。 – 2014-09-29 15:19:35

+0

感谢您的帮助球员 – user3556962 2014-09-29 15:21:07

0

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

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

Btw全局变量不建议,所以我改变了你的。

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个打印语句,所以这仍然需要一段时间。

相关问题