2014-11-02 134 views
0

您好,我想知道是否有方法通過函數遞歸而不改變變量的值。如何在不改變變量的情況下進行遞歸

這裏是我的代碼:

def helper_list_range(self, low, high, rangelist): 
    if self is EmptyValue: 
     return rangelist 

    else: 
     if self.left is not None and self.right is not None: 
      if self.root <= high and self.root >= low: 
       rangelist.append(self.root) 

      self.left.helper_list_range(rangelist) 
      self.right.helper_list_range(rangelist) 

      return rangelist 


def list_range(self, low, high): 

    rangelist = [] 
    self.helper_list_range(low, high, rangelist) 
    return rangelist 

正如你可以看到,我使用一個輔助函數,這樣我追加到rangelist,而不改變其價值時,這個函數執行遞歸。

我想知道有沒有一種方法可以做到這一點,而無需使用輔助函數。使用輔助函數似乎有點模糊。

+0

幫助函數與「附加到範圍列表而不更改其值」無關。幫助函數是完成所有工作的東西,使用從主函數傳入的空列表。 – 2014-11-02 19:11:08

+0

是的,我在主函數中創建了空列表,但是如果我是在輔助函數中創建它的話。該列表將再次變爲空。一旦函數遞歸。所以我想知道,如果我們可以使用與遞歸發生在同一個函數中的列表 – Andre 2014-11-02 19:12:36

回答

2

我想你找默認參數:

def list_range(self, low, high, rangelist = None): 

    if rangelist is None: 
     rangelist = [] 
    # here goes the code of helper_list_range 
+0

哦,是的,我認爲這樣做會起作用。 – Andre 2014-11-02 19:18:50

1

如果我是你,我不會用自己作爲一個參數。最好傳遞樹的根值,然後處理它。我也不會繼續傳遞一個列表,然後附加值。我認爲通過堆積式回傳呼叫建立清單價值更有意義。

根據您如何定義您的BST,我使用一種功能爲您的問題寫了一個簡短的解決方案。我還沒有測試過它,因爲我沒有你的數據結構,所以讓我知道是否有任何錯誤。

​​
+0

是的,這很好。但是自我就像是我的節點......因爲我在課堂上使用它。 – Andre 2014-11-02 19:49:27

+0

然後在你打電話時自我傳遞。你應該使用這個函數,而不是你上面所說的,因爲以這種方式堆棧返回調用比追加結果更加正確,而缺省值是一個黑客。 – 2014-11-02 21:05:24

相關問題