1

我正在学习 Python 的递归。我定义了一个链表,其中每个节点都有item和。我想写一个递归来设置从头到尾的级别,0、1、2 ...nextlevel

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)

递归调用有问题吗?

4

3 回答 3

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的 set_level 方法self作为第一个参数、self.next第二个参数和level第三个参数。

由于LinkNode.set_level只接受两个参数,Python 会引发错误。

于 2013-03-03T19:00:57.657 回答
0

一些东西:

levle = level + 1

这里有一个错字。此外,当通过类上下文调用某些东西时,self方法中将是调用者,所以当你说self.set_level你实际上是在调用时:

set_level(self, self.next, level)

这不是你想要的。你想要的是这样的:

self.next.set_level(level)

但是,鉴于这是一个链接列表,我实际上并没有看到您设置levelself.next (看着您的__init__您似乎没有设置 a self.next,而是设置 a self.left)。我会再次查看您的代码并验证您尝试访问的变量是否正确命名。

于 2013-03-03T19:01:06.497 回答
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 传递。

于 2013-03-03T19:05:35.760 回答