递归Python函数中的持久对象

2 投票
6 回答
7478 浏览
提问于 2025-04-16 07:55

我正在尝试写一个递归函数,这个函数需要在递归的过程中存储和修改一个对象(比如一个集合)。我应该在函数内部使用全局变量吗?还有一个选择是修改或继承函数参数的类,这样它就可以保持这个持久的对象,但我觉得这样不太优雅。如果我完全放弃递归的话,我也可以使用栈来实现……

有没有什么更符合Python风格的方法呢?使用生成器可以解决这个问题吗?

6 个回答

2

把这个集合作为参数传递给递归方法,然后在里面进行修改,再把它传给下一步。复杂的对象是通过引用传递的。

4

对象是通过引用传递的。如果你只是想修改一个对象,可以在递归函数里面进行修改,这样修改的结果在全局范围内都是可见的。

但是,如果你想在递归函数里给一个变量赋值,并希望在函数返回后能看到这个值,那你不能仅仅用=来给一个局部变量赋值。你可以做的是更新另一个对象的某个属性。

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
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)

撰写回答