【问题标题】:Python 3 : Recursion error throwing NameError ( BST problem)Python 3:抛出 NameError 的递归错误(BST 问题)
【发布时间】:2020-05-13 20:31:40
【问题描述】:

我在运行按顺序遍历作为我的类的方法时遇到问题。

class BST:
    def __init__(self,data):
        self.data=data
        self.left=None
        self.right=None

    def insert(self,data):
        if self.data < data:
            #insert right
            if self.right is None:
                self.right = BST(data)
            else:
                insert(self.right, data)
        else:
            if self.left is None:
                self.left = BST(data)
            else:
                insert(self.left,data)

     def inorder(self):
        if self.left:
            inorder(self.left)
        print(self.data)
        if self.right:
            inorder(self.right)


r = BST('50')
r.insert('60')
r.insert('40')
r.inorder()

这适用于插入。请注意,我没有使用 self.insert,只是为了递归而插入。

以下是我在BST类中的有序遍历方法

    def inorder(self):
        if self.left:
            inorder(self.left)
        print(self.data)
        if self.right:
            inorder(self.right)

这会引发错误提示

30 r.insert('60')
     31 r.insert('40')
---> 32 r.inorder()
     33 print(r.right.data)
     34 print(r.left.data)

AttributeError: 'BST' 对象没有属性 'inorder'。

我尝试使用 self.inorder(),它说它收到了两个争论,尽管它期待一个。

但是,如果我从 inorder(Self.left) 到 self.left.inorder(),它工作正常。

有人可以解释一下为什么会这样吗? 另外,在类方法中使用 self.function_name 进行递归调用是否重要,因为我的插入函数仍然有效?

【问题讨论】:

  • 您能否更新您的代码以将整个类定义包含在一个 sn-p 中,然后包含您定义 r 并对其执行操作的所有行?
  • @awarrier99 我已经编辑了这个问题,如果我遗漏了更多细节,你能告诉我吗?
  • 看起来不错,但您能否也说明一下您在哪里定义了inorder 函数?它不是类定义的一部分吗?
  • 您的代码中是否有 insert 函数?那样运行是不可能的。
  • 我马上就发现了一些问题。当你试图递归调用一个类方法时,你需要使用 self 前缀 Ie 来调用它。 self.method。我看到的另一个问题是您在这些递归调用中传递的变量。例如,当您定义 insert 方法时,您指定了一个参数,但在递归调用中传递了两个参数。

标签: python-3.x algorithm binary-search-tree


【解决方案1】:

使用辅助函数试试这个:

class BST:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None


def insert(root, bst):
    if root is None:
        root = bst
    else:
        if root.data < bst.data:
            if root.right is None:
                root.right = bst
            else:
                insert(root.right, bst)
        else:
            if root.left is None:
                root.left = bst
            else:
                insert(root.left, bst)


def inorder(root):
    if root:
        inorder(root.left)
        print(root.data)
        inorder(root.right)


r = BST(50)
insert(r, BST(60))
insert(r, BST(40))
inorder(r)

如果你想在类中包含辅助函数作为方法,那么你可以这样写:

class BST:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

    def insert(self, root, bst):
        if root is None:
            root = bst
        else:
            if root.data < bst.data:
                if root.right is None:
                    root.right = bst
                else:
                    self.insert(root.right, bst)
            else:
                if root.left is None:
                    root.left = bst
                else:
                    self.insert(root.left, bst)

    def inorder(self, root):
        if root:
            self.inorder(root.left)
            print(root.data)
            self.inorder(root.right)


r = BST(50)
r.insert(r, BST(60))
r.insert(r, BST(40))
r.inorder(r)

【讨论】:

  • 非常感谢。这正是我一直在寻找的。你白天做的。
猜你喜欢
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2021-02-13
相关资源
最近更新 更多