2014-10-31 30 views
0

因此,我正在創建一個問題,我要創建一個Python類來生成列表的所有排列,並且正在運行以下問題:在Python類中用__iter__方法實現遞歸函數

  1. 我可以通過一個簡單的遞歸函數輕鬆完成此任務,但作爲一個類似乎我想使用iter方法。我的方法調用遞歸函數(list_all),這與我的iter幾乎相同,這非常令人不安。如何修改我的遞歸函數以符合iter的最佳實踐?
  2. 我寫了這段代碼,看到它的工作,我覺得我不明白它!我嘗試在測試用例中逐行跟蹤代碼,但對我來說,看起來像列表中的第一個元素每次都被凍結,並且列表的其餘部分被混洗。相反,輸出以意想不到的順序出現。我沒有理解一些東西!

謝謝!

class permutations(): 
    def __init__(self, ls): 
    self.list = ls 

    def __iter__(self): 
    ls = self.list 
    length = len(ls) 
    if length <= 1: 
     yield ls 
    else: 
     for p in self.list_all(ls[1:]): 
     for x in range(length): 
      yield p[:x] + ls[0:1] + p[x:] 

    def list_all(self, ls): 
    length = len(ls) 
    if length <= 1: 
     yield ls 
    else: 
     for p in self.list_all(ls[1:]): 
     for x in range(length): 
      yield p[:x] + ls[0:1] + p[x:] 
+2

如果你的功能效果很好,你爲什麼要它擠進一類?如果關鍵是懶惰地生成排列,只需在函數中使用「yield」。 – uselpa 2014-10-31 07:54:21

+0

我同意這一點。在這個問題中特別指出了這個詞,因此我正在考慮如何讓它成爲一個與__iter__方法接口的可迭代類。 – Joe 2014-10-31 08:11:19

回答

0

只需撥打從__iter__self.list_all

class permutations(): 
    def __init__(self, ls): 
    self.list = ls 

    def __iter__(self): 
    for item in self.list_all(self.list): 
     yield item 

    def list_all(self, ls): 
    length = len(ls) 
    if length <= 1: 
     yield ls 
    else: 
     for p in self.list_all(ls[1:]): 
     for x in range(length): 
      yield p[:x] + ls[0:1] + p[x:] 
+0

這是學習過程中那些苦樂參半的時刻之一。開心我可以得到理想的結果。激怒我沒有提前建立這種聯繫。 謝謝! – Joe 2014-10-31 08:31:06