【问题标题】:How do Python Recursive Generators work?Python 递归生成器是如何工作的?
【发布时间】:2016-10-05 09:03:12
【问题描述】:

Python tutorial 中,我了解到

像函数一样,生成器可以递归编程。下列 示例是一个生成器,用于创建给定项目列表的所有排列。

def permutations(items):
    n = len(items)
    if n==0: yield []
    else:
        for i in range(len(items)):
            for cc in permutations(items[:i]+items[i+1:]):
                yield [items[i]]+cc

for p in permutations(['r','e','d']): print(''.join(p))
for p in permutations(list("game")): print(''.join(p) + ", ", end="")

我无法弄清楚它是如何产生结果的。递归的东西和“产量”真的让我很困惑。有人能把整个过程解释清楚吗?

【问题讨论】:

  • 如果您不熟悉递归,请先查看一些更简单的示例。
  • 递归的东西和'yield'混在一起,这让我抓狂。但是,无论如何,谢谢你的回答。
  • 如果您无法理解递归和生成器的组合,则意味着您没有正确理解这两部分之一。

标签: python recursion generator permutation


【解决方案1】:

这有 2 个部分 --- 递归和生成器。这是仅使用递归的非生成器版本:

def permutations2(items):
    n = len(items)
    if n==0: return [[]]
    else:
        l = []
        for i in range(len(items)):
            for cc in permutations2(items[:i]+items[i+1:]):
                l.append([items[i]]+cc)
        return l

l.append([item[i]]+cc) 大致翻译为这些项目的排列,包括 item[i] 是第一项的条目,以及其余项目的排列。

生成器部分 yield 排列之一,而不是 return 整个排列列表。

【讨论】:

  • 感谢您的回答。这个我很清楚。
【解决方案2】:

当你调用一个返回的函数时,它会在产生结果后消失。

当你向生成器询问它的 next 元素时,它会生成它(yields it),然后暂停 -- yields(控制回到你身边。当再次询问 next 元素时,它将恢复其操作,并正常运行,直到遇到yield 语句。然后它将再次产生一个值并暂停。

因此,使用某些参数调用生成器会导致创建实际的内存实体,一个对象,能够运行,记住它的状态和参数,并在被询问时产生值。

对同一个生成器的不同调用会在内存中产生不同的实际对象。该定义是创建该对象的配方。定义配方后,当它被调用时,it 可以调用它需要的任何其他配方——或同一个——来创建它需要的新内存对象,为其生成值。 p>

这是一个普遍的答案,不是特定于 Python 的。

【讨论】:

    【解决方案3】:

    感谢您的回答。确实让我理清思路,现在想分享一些我在网上找到的关于递归和生成器的有用资源,对初学者也很友好。

    1. 了解python中的生成器。下面的链接非常可读且易于理解。 What does the "yield" keyword do in Python?

    2. 要理解递归,“https://www.youtube.com/watch?v=MyzFdthuUcA”。这个 youtube 视频提供了一个“专利”的 4 步方法来编写任何递归方法/函数。这是非常明确和可行的。该频道还有几个视频向人们展示递归是如何工作的以及如何跟踪它。

    我希望它可以帮助像我这样的人。

    【讨论】:

    • 您可以接受其中一个对您最有帮助的答案。
    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 2021-05-22
    • 2016-05-03
    • 2018-08-10
    • 1970-01-01
    • 2019-10-18
    • 2012-05-03
    • 2013-09-16
    相关资源
    最近更新 更多