2013-10-17 50 views
0

看看這個片斷:的Python:遞歸:通過電話傳遞一些值下降

def recur(n): 
    ds = {} 
    x=do_foo(n) 
    if foo(n): ds[n] = recur(x) 
    else: return x 

我想問的是DS在第一次迭代是空的,然後它如果是真的一定條件下增加。如果它重複出現,那麼在第二次迭代時它會進入ds[n] = recur(x),因此在第n次迭代中,ds再次被定義爲ds = {} ..或ds保留了其以前的元素。如果沒有,那麼如何保留這些元素?

+2

請將其改爲有效的python。如果我甚至無法掌握您的代碼的目的,我無法提供幫助。 – Noctua

+0

或者至少舉一個你想要做什麼的好例子... – PearsonArtPhoto

+0

@Noctua更新 – user2290820

回答

1

由於您發佈的代碼是無效的Python,因此很難說出您在這裏想要的內容,但我認爲您問的是如何通過調用傳遞某種緩存。

執行此操作的方法是將緩存設置爲可選參數。這樣你可以在沒有緩存的情況下調用你的函數,或者你可以將它傳遞給遞歸調用。

def recur(n, ds=None): 
    if ds is None: ds = {} 
    x=do_foo(n) 
    if foo(n): 
     ds[n] = recur(x, ds) 
    else: 
     return x 

另外,使用一個類,讓你在高速緩存會持續多久完全控制:

class Bar(object): 
    def __init__(self): 
     self.ds = {} 

    def recur(self, n): 
     x=do_foo(n) 
     if foo(n): 
      self.ds[n] = self.recur(x) 
     else: 
      return x 
+0

是的如何通過調用傳遞某種緩存是我正在尋找的。我想過把它作爲arg但在其他地方看到過其他一些方法。你不認爲ds = {}可以被聲明爲全局的,雖然這不建議你? – user2290820

+0

使用全球化似乎是一個非常糟糕的主意。要使用的兩種技術是將其作爲參數傳遞下去,或者將該函數作爲類實​​例的方法並將其另存爲屬性。 – Duncan

+0

而不是類我寧願使用memoize裝飾。感謝幫助! – user2290820

1

添加ds作爲參數傳遞給函數。

def recur(n, ds=None): 
    ds = ds or {} 
    #... 
    recur(n, ds=ds) 
0

就像任何編程語言,函數裏面有你存在,只有當函數運行變量:這些都是local variablesds是一個局部變量,只有在函數運行時才存在。無論何時再次運行該函數,ds都不會成爲第一個(假設您正在運行同一程序的兩個實例,即使設置了相同的參數,也有兩種不同的情況)。

爲了解決你的問題,有兩種方法:

  • 聲明ds全球(任何函數之外),並在該函數的第一行是指它作爲global ds
  • ds作爲參數傳遞給功能(這是非常好的替代處理這種情況)