其他答案已经解释了为什么没有立即无限递归问题(因为生成器被懒惰地解释)。但是,我认为考虑何时可能达到 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) 个项目后,生成器才会达到该限制。我不会屏住呼吸等待的。