2013-03-03 22 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