2015-05-31 203 views
0

我正在嘗試製作一個小腳本,並且這樣做的有效方式涉及調用其內部的函數。但是,這會給出消息「RuntimeError:獲取對象的str時超出最大遞歸深度」。防止超過最大遞歸深度

我試圖讓程序在它到達之前退出,但似乎沒有做這項工作。我想知道是否有任何方法可以在一定數量的運行後停止程序,所以這個錯誤不會發生。這是我試圖解決這個問題:

import sys 
n = 0 
def cycle(b,n): 
    total = 0 
    for i in str(n): 
     for y in i: 
     total+=int(y)**b 
    n+=1 
    print(total) 
    if n == 10: 
    sys.exit() 
    else: 
    cycle(b,total) 
cycle(2,562) 

謝謝。

+0

*「同時獲得一個物體的STR遞歸深度超過」表明錯誤ISN」 t在你顯示的代碼中。請提供[最小示例](http://stackoverflow.com/help/mcve)。 – jonrsharpe

+0

爲什麼函數不返回任何內容?還要注意函數中的'n'與你設置爲零的'n'不一樣。 – holdenweb

+0

爲什麼你在頂端分配'n = 0',然後不做任何事情? 'i'已經是一個單獨的字符時,'我在y'中有什麼意義? – TigerhawkT3

回答

2

嘗試傳遞一個計數器,並避免讓混亂的變量名:

import sys 
def cycle(b,n, counter): 
    total = 0 
    for i in str(n): 
     for y in i: 
     total+=int(y)**b 
    counter+=1 
    print(total) 
    if counter == 10: 
    sys.exit() 
    else: 
    cycle(b,total,counter) 
cycle(2,562,0) 

Run it here.

+0

謝謝!這正是我試圖用n = 0做的,但它似乎沒有奏效。 – user1956027

+0

爲了downvoter,爲什麼downvote? –

0

調用函數遞歸可能比較方便,但肯定效率不高(至少與Python你執行」重新使用,因爲你得到這個錯誤)。

但是,您正在嘗試執行的操作(即限制遞歸深度)已經發生,因爲您會得到與遞歸深度相關的運行時錯誤。

爲什麼不在更高的級別上捕獲運行時錯誤?

0

您需要返回並使用適當的基本情況:

def cycle(b, n, seen): 
    total = 0 
    if n == 1 or n in seen: 
     return n == 1 
    for i in str(n): 
     for y in i: 
      total += int(y) ** b 
    seen.add(n) 
    n += 1 
    return cycle(b, total, seen) 


print(cycle(2, 19,set())) 

輸出:*

In [34]: cycle(2,562,set()) 
Out[34]: False 

In [35]: cycle(2,19,set()) 
Out[35]: True 

In [36]: cycle(2,1,set()) 
Out[36]: True 

In [37]: cycle(2,2,set()) 
Out[37]: False 

In [38]: cycle(2,7,set()) 
Out[38]: True