将自身数据传递给递归函数

时间:2010-03-14 18:42:58

标签: python recursion self

我正在尝试设置一个函数来做这样的事情

   def __binaryTreeInsert(self, toInsert, currentNode=getRoot(), parentNode=None):

当前节点以root用户身份启动,然后我们将其更改为方法中的其他节点,然后再次再次调用它。

但是,我无法让'currentNode = getRoot()'工作。如果我尝试调用funcion getRoot()(如上所述)它表示我没有给它所有必需的变量,但如果我尝试调用self.getRoot()它抱怨self是一个未定义的变量。有没有办法可以在调用此方法时不必指定根目录?

编辑:此方法的基本情况已经

if currentNode == None:

所以使用它来设置根本不起作用

4 个答案:

答案 0 :(得分:2)

虽然arg=None是非提供参数的惯用Python标记值,但 不是None。例如,在Lua中,惯用的非提供参数是一个空表。我们实际上可以将其应用于这种情况:

class Foo:
    sentinel = {}
    def bar(self, arg=sentinel):
        if arg is self.sentinel:
            print "You didn't supply an argument!"
        else:
            print "The argument was", arg

f = Foo()
f.bar(123)
f.bar()
f.bar(None)
f.bar({})

输出:

The argument was 123
You didn't supply an argument!
The argument was None
The argument was {}

除了明确传递Foo.sentinel之外,这适用于任何情况,因为Foo.sentinel保证具有唯一地址 - 这意味着x is Foo.sentinel 时为真x Foo.sentinel :)因此,由于我们在Foo.sentinel周围创建的闭包,只有一个对象可以创建一个模糊的情况,它永远不会意外使用。

答案 1 :(得分:0)

你可以做到

def __binaryTreeInsert(self, toInsert, currentNode=None, parentNode=None):
   if currentNode is None:
      currentNode = self.getRoot()

...

答案 2 :(得分:0)

定义函数或方法时,会立即评估def行,包括任何关键字参数。因此,函数调用和可变对象之类的东西通常不适用于默认参数。

解决方案是使用sentinel值。 None是最常见的,但对于None是有效值的情况,您可以使用其他标记,例如:

not_provided = object()
def _binaryTreeInsert(self, toInsert, currentNode=not_provided, parentNode=None):
    if currentNode is not_provided:
        currentNode = self.getRoot()

答案 3 :(得分:-1)

def __binaryTreeInsert(self, toInsert, currentNode=0, parentNode=None):
    if not currentNode: 
        currentNode = self.getRoot()