2014-09-29 96 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個打印語句,所以這仍然需要一段時間。

相關問題