2013-03-03 53 views
1

我正在學習Python的遞歸。我定義了一個鏈表,其中每個節點有itemnextlevel。我想寫一個遞歸從頭部的水平與0設置爲尾,1,2 ...在Python中使用遞歸調用方法

class LinkNode(object): 
    """A node in a linked list.""" 

    def __init__(self, item, next=None): 
     """(LinkNode, object, LinkNode) -> NoneType 
     Initialize this node to store item and have next and level 0. 
     """ 
     self.item = item 
     self.left = next 
     self.level = 0 # the level of the link 

    def set_level(self, level): 
     """(LinkNode, int) -> NoneType 
     Set the level attribute of every node in the list 
     for example: first node is 0, second is 1, third is 3... 
     """ 
     if self is None: 
      pass 
     else: 
      self.level = level 
      levle = level + 1 
      self.set_level(self.next, level) 

但是當我運行它,我得到了以下錯誤:

File "C:\Program Files\Wing IDE 101 
4.1\src\debug\tserver\_sandbox.py", line 29, in <module> File "C:\Program Files\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", 
line 21, in set_level builtins.TypeError: set_level() takes exactly 2 
positional arguments (3 given) 

遞歸調用有什麼問題嗎?

+1

您需要'self.next.set_level(level)'。當你有'an_object.method(arg1,...)'時,這被隱式轉換爲解釋你錯誤的'AClass.method(an_object,arg1,...)'。 – dmg 2013-03-03 18:57:02

+0

這也意味着'自己不是無' – Eric 2013-03-03 19:02:03

+0

是的,檢查應該是'如果self.next不是無' – dmg 2013-03-03 19:05:47

回答

0

有幾件事情:

levle = level + 1 

在這裏有一個錯字。還呼籲通過類方面的東西時,self的方法是調用,所以當你說self.set_level你實際上調用:

set_level(self, self.next, level) 

這是不是你想要的。什麼你想會是這樣的:

self.next.set_level(level) 

但是考慮到這是一個鏈表,其實我不看你設定self.next的level(這看你__init__你似乎不要設置self.next,而改爲self.left)。我會再次查看您的代碼,並驗證您嘗試訪問的變量是否正確命名。

+0

非常感謝,它的工作原理。 – duckduck 2013-03-03 20:01:08

0
def set_level(self, level): 
    """(LinkNode, int) -> NoneType 
    Set the level attribute of every node in the list 
    for example: first node is 0, second is 1, third is 3... 
    """ 
    self.level = level 
    if self.next is not None: 
     self.next.set_level(level+1) 

當你調用self.set_level(...)方法self_level被稱爲與實例self(對象的點的左側)作爲第一個參數。

所以self.set_level(self.next, level)呼叫self的與self set_level方法作爲第一個參數,self.next作爲第二個參數,和level作爲第三個參數。

由於LinkNode.set_level只有兩個參數,所以Python會產生一個錯誤。

+0

@DJV:感謝您的更正。 – unutbu 2013-03-03 19:10:08

0

簡答題:使用self.next.set_level(level)代替self.set_level(self.next, level)

(執行中的)的問題是在聲明:

self.set_level(self.next, level) 

這意味着set_level函數需要2個參數,但通過3:(self, self.next, level)

當在Python定義一個類的成員函數,您添加「self」參數(其名稱只是一個約定),它將標識該函數適用的對象。

因此,有些語句def function(self)被調用object.function(),其中對象將作爲self.argument傳遞。

+0

非常感謝,現在有效。 – duckduck 2013-03-03 20:05:06