他の回答では、すぐに無限再帰の問題が発生しない理由が説明されています (ジェネレーターが遅延解釈されるため)。ただし、Python インタープリターに存在する再帰の有限制限にいつ到達するかを検討することも興味深いと思います。
最初に、コードを少し単純化できることに気付きました (実際に必要な関数よりもいくつか多くの関数があり、N
ジェネレーターは と同じですitertools.count(1)
)。したがって、ジェネレーターのより単純なバージョンは次のとおりです。
from itertools import count
def RZ():
x=count(1)
y=RZ()
while True:
yield next(x)
yield next(y)
出力例:
>>> gen = RZ()
>>> for i in range(1, 21):
print i, next(gen)
1 1
2 1
3 2
4 1
5 3
6 2
7 4
8 1
9 5
10 3
11 6
12 2
13 7
14 4
15 8
16 1
17 9
18 5
19 10
20 3
次に、ネストされたジェネレーターを調べて、それらがどれだけ深く評価されたかをカウントする関数を作成しました。このコードが Python バージョン間で移植可能かどうかはわかりません (私は 2.7 を使用しています):
def getDepth(gen):
depth = 0
while gen:
depth += 1
gen = gen.gi_frame.f_locals.get("y")
return depth
それからの出力(インデックス、深さ、値):
>>> for i in range(1, 21):
print i, getDepth(gen), next(gen)
1 1 1
2 2 1
3 3 2
4 3 1
5 4 3
6 4 2
7 4 4
8 4 1
9 5 5
10 5 3
11 5 6
12 5 2
13 5 7
14 5 4
15 5 8
16 5 1
17 6 9
18 6 5
19 6 10
20 6 3
これらの深さの値は対数的に増加しています。具体的には、シーケンスの N 番目の値を生成するために必要なネストされたジェネレーターの深さは ですceil(log(N, 2)) + 1
。
私の Python のコピーでは、再帰は (デフォルトで) 100 レベルの深さまで許可されています。ジェネレーターは、2^99 + 1 (=633,825,300,114,114,700,748,351,602,689) 個のアイテムが生成された後にのみ、その制限に達します。私はそれを待って息を止めませんでした。