当前位置: 首页 > 面试题库 >

使用收益递归

邢飞雨
2023-03-14
问题内容

有什么方法可以混合使用递归和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

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


问题答案:

是的,您可以这样做:

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。



 类似资料:
  • 问题内容: 我已经使用泛型在Java中创建了一个链表,现在我希望能够遍历该表中的所有元素。在C#中,当遍历列表中包含的元素列表时,我将在链接列表中使用。 我将如何创建上面的Java版本,在其中可以迭代链接列表中包含的所有项目? 我希望能够编写代码ala 并认为价值“属性” /方法将由类似于以下内容的代码组成 编辑:请注意,我对使用任何第三方API都不感兴趣。仅内置Java功能。 问题答案: 我在这

  • 问题内容: 给出以下代码: 语言规范是否定义了对的调用的返回值?换句话说:每个JVM是否总是相同? 在Sun JVM中,返回值为,但是我想确定这与VM无关。 问题答案: 是的,语言规范定义结果为“ 2”。如果VM采取不同的方式,则不符合规范。 大多数编译器都会对此抱怨。以Eclipse为例,它将声称永远不会执行return块,但这是错误的。 编写这样的代码是非常糟糕的做法,永远不要这样做:)

  • 本文向大家介绍区分每股收益(EPS)和稀释每股收益(D-EPS)。,包括了区分每股收益(EPS)和稀释每股收益(D-EPS)。的使用技巧和注意事项,需要的朋友参考一下 每股收益(EPS)和稀释每股收益(D-EPS)之间的主要区别如下- 每股收益(EPS) 每股稀释收益(D-EPS) 计算公司的基本每股收益。 计算公司的每股可转换股收益。 主要目的是计算公司的盈利能力。 主要目的是计算包括可转换证券

  • 我是Youtube的合作伙伴,我在Youtube上把视频赚钱。已经通过一些与我的谷歌Adsense账户相关的渠道每月收到一小笔款项。 现在,我想生成一个报告,收集从每个渠道收到的货币价值和观点。我在Google Code上做了以下问题,因为我认为API中存在一些问题,但碰巧我错误地使用了API。请参阅下面的链接。 http://code.google.com/p/gdata-issues/issu

  • 我一直在看一些PHP中的示例,试图了解人们在什么情况下会使用它,我开始注意到我所看到的所有示例都是中的或语句。 是否有一种方法可以在的之外使用产量?

  • 我一直在看一些PHP中的示例,试图了解人们在什么情况下会使用它,我开始注意到我所看到的所有示例都是中的或语句。 是否有一种方法可以在的之外使用产量?