2

オブジェクト(セットなど)を再帰的に格納および変更する必要がある再帰関数を作成しようとしています。関数内でグローバル名を使用する必要がありますか?もう1つのオプションは、関数のパラメーターのクラスを変更または継承して、この永続オブジェクトを保持できるようにすることですが、エレガントではありません。再帰を完全に放棄する場合は、スタックを使用することもできます...

これを行うためのPythonの方法はありますか?ジェネレーターでうまくいくでしょうか?

4

6 に答える 6

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)
于 2010-12-02T02:11:26.570 に答える
3

オブジェクトは参照によって渡されます。オブジェクトのみを変更する場合は、再帰関数内から変更でき、変更はグローバルに表示されます。

再帰関数内で変数を割り当て、関数が戻った後にそれを確認する必要がある場合は、ローカル変数に。を割り当てるだけでは不十分です=。あなたができることは、別のオブジェクトのフィールドを更新することです。

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
于 2010-12-02T02:10:37.163 に答える
2

セットを引数として再帰メソッドに渡し、次のステップに渡す前にそこで変更します。複雑なオブジェクトは参照によって渡されます。

于 2010-12-02T02:10:23.577 に答える
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)

于 2010-12-02T02:10:22.923 に答える
0

渡すオブジェクトが可変である場合、より深い再帰でのオブジェクトへの変更は、以前の再帰で見られます。

于 2010-12-02T02:09:21.867 に答える
0
  1. 関数に対してグローバル変数を使用します。

  2. オブジェクトをアキュムレータとして渡します。

    def recurse(foo, acc=None):
        acc = {}
        recurse(acc)
    
于 2010-12-02T02:09:40.363 に答える