1

次のコード スニペットを検討してください (Python 2.7 では非ローカル キーワードを使用できないため、グローバルを使用していたことに注意してください)。

def foo(L,K):
    global count
    count = 0
    def bar(f,L):
        global count
        for  e in L:
            if e - f == K or f - e == K: count += 1
            yield e
    try:
        while True:
            L = bar(L.next(),L)
    except StopIteration:
        return count
count=0
print foo((int(e) for e in some_string.split()),some_number)

どこ

some_string: A space delimited integers
some_number: An integer

の場合len(some_string) = 4000、上記のコードはエラーで失敗します

RuntimeError: maximum recursion depth exceeded while calling a Python object

内部でネストされたジェネレーターが再帰として実装されているためですか?

4

1 に答える 1

5

を、ジェネレーター自体であるLの結果に置き換えています。barしたがって、再帰的にネストされたジェネレーター式の形式で にbar戻すことになります。bar

この構造は、最終的に再帰の深さの制限を超えます。

于 2012-08-05T16:18:37.643 に答える