我正在尝试编写一个递归函数,该函数需要在递归时存储和修改一个对象(比如一个集合)。我应该在函数中使用全局名称吗?另一种选择是修改或继承函数参数的类,以便它可以保留这个持久对象,但我觉得它不优雅。如果我完全放弃递归,我也可以使用堆栈......
有没有这样做的pythonic方式?发电机可以解决问题吗?
我正在尝试编写一个递归函数,该函数需要在递归时存储和修改一个对象(比如一个集合)。我应该在函数中使用全局名称吗?另一种选择是修改或继承函数参数的类,以便它可以保留这个持久对象,但我觉得它不优雅。如果我完全放弃递归,我也可以使用堆栈......
有没有这样做的pythonic方式?发电机可以解决问题吗?
只需通过递归方法传递您的持久对象。
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)
对象通过引用传递。如果您只是修改一个对象,您可以在递归函数中执行此操作,并且更改将是全局可见的。
如果您需要在递归函数中分配一个变量并在函数返回后查看它,那么您不能只使用=
. 您可以做的是更新另一个对象的字段。
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
将集合作为参数传递给递归方法,然后在将其传递到下一步之前对其进行修改。复杂对象通过引用传递。
如果它是容器(不是不可变数据类型),则可以通过以下方式传递对象:
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)
如果您传递的对象是可变的,那么在更深层次的递归中对其进行的更改将在早期的递归中看到。
对函数使用全局变量。
将对象作为累加器传递:
def recurse(foo, acc=None):
acc = {}
recurse(acc)