递归python函数中的持久对象

时间:2010-12-02 02:03:53

标签: python recursion persistent

我正在尝试编写一个递归函数,它需要在递归时存储和修改一个对象(比如一个集合)。我应该在函数内部使用全局名称吗?另一种选择是修改或继承函数参数的类,以便它可以保留这个持久对象,但我发现它并不优雅。如果我完全放弃递归,我也可以使用堆栈......

有这样做的pythonic方法吗?发电机可以做到这一点吗?

6 个答案:

答案 0 :(得分:9)

只需通过递归方法传递持久对象。

def recursivemethod(obj_to_act_on, persistent_obj=None):

    if persistent_obj == None:
        persistent_obj = set()

    # Act on your object

    return recursivemethod(newobj, persistent_obj)

答案 1 :(得分:2)

将集合作为参数传递给递归方法,然后在将其传递到下一步之前将其修改。复杂对象通过引用传递。

答案 2 :(得分:2)

通过引用传递对象。如果您只修改对象,则可以在递归函数中执行此操作,并且更改将全局可见。

如果你需要在递归函数中分配一个变量并在函数返回后看到它,那么你不能只用=分配一个局部变量。你可以做的是更新另一个对象的字段。

class Accumulator: pass

def foo():
    # Create accumulator
    acc = Accumulator()
    acc.value = 0

    # Define and call a recursive function that modifies accumulator
    def bar(n):
        if (n > 0): bar(n-1)
        acc.value = acc.value + 1
    bar(5)

    # Get accumulator
    return acc.value

答案 3 :(得分:1)

如果它是容器(不是不可变数据类型),则可以通过以下方式传递对象:

import random

def foo(bar=None, i=10):
    if bar is None:
        bar = set()
    if i == 0:
        return bar
    bar |= set(random.randint(1, 1000) for i in xrange(10))
    return foo(bar, i - 1)

random_numbers_set = foo()

(不要问我这是做什么的......我只是在输入随机的东西:P)

答案 4 :(得分:0)

如果您传递的对象是可变的,那么在更早的递归中将会看到更深层递归的更改。

答案 5 :(得分:0)

  1. 对函数使用变量global。

  2. 将对象作为累加器传递:

    def recurse(foo, acc=None):
        acc = {}
        recurse(acc)