一尘不染

使用收益递归

python

有什么方法可以混合使用递归和yield语句吗?例如,无限数生成器(使用递归)将类似于:

def infinity(start):
    yield start
    # recursion here ...

>>> it = infinity(1)
>>> next(it)
1
>>> next(it)
2

我试过了:

def infinity(start):
    yield start
    infinity(start + 1)

def infinity(start):
    yield start
    yield infinity(start + 1)

但是他们都没有做我想要的事情,第一个在屈服后停止start,第二个在屈服之后start,然后是发电机,然后停了下来。

注意: 请知道,您可以使用while循环来做到这一点:

def infinity(start):
    while True:
        yield start
        start += 1

我只想知道这是否可以递归进行。


阅读 149

收藏
2020-12-20

共1个答案

一尘不染

是的,您可以这样做:

def infinity(start):
    yield start
    for x in infinity(start + 1):
        yield x

但是,一旦达到最大递归深度,这将出错。

从Python 3.3开始,您将可以使用

def infinity(start):
    yield start
    yield from infinity(start + 1)

如果您只是递归地调用生成器函数而不循环或生成yield from它,那么您要做的就是构建一个新的生成器,而无需实际运行函数主体或产生任何结果。

有关更多详细信息,请参见PEP 380

2020-12-20