2017-03-24 18 views
1

我想知道是否有一個標準的方式或更好的方法來控制無限遞歸比在我的代碼下面?我希望遞歸函數在最大嘗試後放棄。下面的代碼通過引入try方法參數並在遞歸調用期間增加它來完成它。有沒有更好的辦法?更好的方法來控制無限遞歸

def Rec(attempt=0): 
    if attempt==10: 
     return() 
    else: 
     print(attempt) 
     Rec(attempt=attempt+1) 

Rec() 
+4

你說的** '好' 的意思是**? –

+0

您可以保存所有以前的參數。如果你得到的參數與之前的調用相同,你就知道你已經進入了一個循環。 – Barmar

+0

@Barmar只有在你的函數是一個「純」函數時纔有效;-) – thebjorn

回答

0

你已經很好。這是要走的路。這很好,因爲它重量輕。你基本上需要一個int和一個條件分支 - 就是這樣。

或者,您可以嘗試保證在沒有計數器的情況下打破循環(但通常情況下,這取決於個案)。

3

還有這樣但不建議你想做的事 - 我只貼吧參考,是很好的在其他情況下使用...

#!/usr/bin/env python 

import sys 
sys.setrecursionlimit(5) 

def Rec(attempt=0): 
    print attempt 
    Rec(attempt=attempt+1) 

try: 
    Rec() 
except RuntimeError: 
    print 'maximum recursion depth exceeded' 

sys.setrecursionlimit(limit) 要如python文檔中所說,sys.setrecursionlimit(limit)所做的是:

設置Python解釋器堆棧的最大深度以進行限制。此限制可防止無限遞歸導致堆棧溢出並導致Python崩潰。

可能的最高限制是平臺相關的。用戶可能需要 當她有一個程序需要較深的遞歸和支持較高限制的平臺時,將限制設置得更高。這應該是 小心完成,因爲太高的限制可能會導致崩潰。

所以,在我看來是不好用Python解釋器堆棧混亂,除非你非常清楚地知道自己在做什麼。

+0

如果你打算這樣做,那麼知道它適用於整個解釋器。如果你不想潛在地撥打其他電話,請務必將其設回。 – TemporalWolf

+0

是的,我想到了。 :) –

3

你可以做一個裝飾,然後你可以寫你正確的遞歸函數,用其一貫的退出條件,還要處以遞歸限制:

def limit_recursion(limit): 
    def inner(func): 
     func.count = 0 
     def wrapper(*args, **kwargs): 
      func.count += 1 
      if func.count < limit: 
       result = func(*args, **kwargs) 
      else: 
       result = None 
      func.count -= 1 
      return result 
     return wrapper 
    return inner 

你的代碼是(與3的限制):

@limit_recursion(limit=3) 
def Rec(): 
    print('hi') 
    Rec() 

運行:

>>> Rec() 
hi 
hi 
hi 
+0

注意:我不確定這將在多線程環境中如何工作。我想它不會按預期工作(c: –