オブジェクト(セットなど)を再帰的に格納および変更する必要がある再帰関数を作成しようとしています。関数内でグローバル名を使用する必要がありますか?もう1つのオプションは、関数のパラメーターのクラスを変更または継承して、この永続オブジェクトを保持できるようにすることですが、エレガントではありません。再帰を完全に放棄する場合は、スタックを使用することもできます...
これを行うためのPythonの方法はありますか?ジェネレーターでうまくいくでしょうか?
オブジェクト(セットなど)を再帰的に格納および変更する必要がある再帰関数を作成しようとしています。関数内でグローバル名を使用する必要がありますか?もう1つのオプションは、関数のパラメーターのクラスを変更または継承して、この永続オブジェクトを保持できるようにすることですが、エレガントではありません。再帰を完全に放棄する場合は、スタックを使用することもできます...
これを行うためのPythonの方法はありますか?ジェネレーターでうまくいくでしょうか?
再帰メソッドを介して永続オブジェクトを通過するだけです。
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)