Pythonrecursion和返回语句
我对Python和整个recursion函数相当陌生,所以请原谅我的无知。
我想在Python中实现一个二叉search树,并有以下插入方法(从一个类中取出):
def insert(self, key, root=None): '''Inserts a node in the tree''' if root == None: root = self.root if root.key == None: self._update(root, key) return 0 else: tmp = root if key > tmp.key: # we work with the right subtree self.insert(key, root=tmp.right) elif key < tmp.key: # we work with the left subtree self.insert(key, root=tmp.left) else: # key already exists return 0
我不知道这是否清晰,但它遍历树,直到它得到一个None值,并用插入的密钥更新节点。
现在,该方法很好地工作,并从头开始正确创build一个BST。 但是返回语句有问题,因为如果没有recursion执行,它只返回0。
>>> bst.insert(10) 0 >>> bst.insert(15) >>> bst.root.right.key 15 >>>
“插入”根键再次返回0(从第15行)应该的方式。
>>> bst.insert(10) 0
我无法弄清楚为什么会发生这种情况。 如果我把一个打印语句在第6行,它正确执行,但它不会返回任何东西超过第一次插入。 为什么是这样? (我很确定我错过了一些关于Python和recursion的基本信息)
谢谢你的帮助,
伊万
PS:我已经读过recursion不是实现BST的最好方法,所以我会研究其他解决scheme,但是我想在继续之前知道这个答案。
在你的recursion线上,你不会返回任何东西。 如果你想让它返回0,你应该用下面的行replace它们:
return self.insert(key, root=tmp.left)
而不是仅仅
self.insert(key, root=tmp.left)
你在一个函数里面,想要返回一个值,你做了什么? 你写
def function(): return value
在你的情况下,你想返回一个函数调用返回的值,所以你必须这样做。
def function(): return another_function()
但是你呢
def function(): another_function()
为什么你认为这应该工作? 当然,你使用recursion,但在这种情况下,你应该记住Python的禅说:
特例不足以打破规则。