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的禅说:

特例不足以打破规则。