擅长:python、mysql、java
<p>其他答案解释了为什么不存在立即无限递归问题(因为生成器的解释是惰性的)。但是,我认为考虑一下何时可能达到Python解释器中存在的递归的有限限制也是很有趣的。在</p>
<p>首先,我注意到您的代码可以简化一点(您的函数比实际需要的还要多,而且您的<code>N</code>生成器与<code>itertools.count(1)</code>完全相同)。下面是一个更简单的生成器版本:</p>
<pre><code>from itertools import count
def RZ():
x=count(1)
y=RZ()
while True:
yield next(x)
yield next(y)
</code></pre>
<p>样本输出:</p>
^{pr2}$
<p>接下来,我编写了一个函数,该函数可以对嵌套生成器进行反省,并计算它们被计算的深度。我不确定这段代码是否可以在python版本之间移植(我使用的是2.7):</p>
<pre><code>def getDepth(gen):
depth = 0
while gen:
depth += 1
gen = gen.gi_frame.f_locals.get("y")
return depth
</code></pre>
<p>输出(索引、深度、值):</p>
<pre><code>>>> 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
</code></pre>
<p>这些深度值呈对数增长。具体地说,生成序列的第n个值所需的嵌套生成器的深度是<code>ceil(log(N, 2)) + 1</code>。在</p>
<p>在我的Python副本中,递归允许(默认情况下)达到100级深度。只有在生产了2^99+1(=63382530014114700748351602689)个项目后,生成器才会达到该限制。我不会屏住呼吸等着的。在</p>