xxbaizero 2023-10-05 00:25 采纳率: 100%
浏览 9
已结题

python中关于yield和递归结合问题

img



def partitions(n, m):
    if n > 0 and m > 0:
        print(f"Entering partitions({n}, {m})")
        if n == m:
            print(f"  Yielding {m}")
            yield str(m)
        for p in partitions(n - m, m):
            print(f"  Yielding {p} + {m}")
            yield p + '+' + str(m)
        yield from partitions(n, m - 1)
    print(f"Exiting partitions({n}, {m})")

# 调用 partitions(5, 3)
gen = partitions(5, 3)
for partition in gen:
    pass

不是很懂yield和递归结合起来后的运行顺序

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-05 02:04
    关注

    【相关推荐】



    • 你可以参考下这篇文章:Python中yield的作用与for循环的区别,yield关键字的白话解析
    • 您还可以看一下 李兴华老师的Python实战编程课程中的 yield实现生成器小节, 巩固相关知识点
    • 除此之外, 这篇博客: python中的yield关键字是个什么鬼?它有什么用处?中的 yield的好处 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

      介绍了这么多定义和用法,那么到底为什么要用yield呢?它有什么样的好处呢?

      在很多时候,我们需要逐个去获取容器内的某些数据,而这种仅仅获取部分元素的情况,并不需要我们将容器内所有的元素都取出来。比如说一个容器内现有10000个元素,但我们只需要前5个元素,那么解决办法通常由如下两种:

       

      • 获取容器内的所有元素,然后取出前 5 个;
      • 从头开始,逐个迭代容器内的元素,迭代 5 个元素之后停止。

      显而易见,如果容器内的元素数量非常多(比如有 10 ** 8 个),或者容器内的元素体积非常大,那么后一种方案能节省巨大的时间、空间开销。

      现在假设,我们有一个函数,其产出(返回值)是一个列表。而若我们知道,调用者对该函数的返回值,只有逐个迭代这一种方式。那么,如果函数生产列表中的每一个元素都需要耗费非常多的时间,或者生成所有元素需要等待很长时间,则使用 yield 把函数变成一个生成器函数,每次只产生一个元素,就能节省很多开销了。

      参考文章:

      https://liam0205.me/2017/06/30/understanding-yield-in-python/

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月13日
  • 已采纳回答 10月5日
  • 创建了问题 10月5日

悬赏问题

  • ¥15 mySQL5.7.34安装遇到的问题
  • ¥15 结构功能耦合指标计算
  • ¥20 visual studio中c语言用ODBC链接SQL SERVER
  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 非科班怎么跑代码?如何导数据和调参
  • ¥15 福州市的全人群死因监测点死亡原因报表
  • ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
  • ¥15 系统2008r2 装机配置推荐一下
  • ¥500 服务器搭建cisco AnyConnect vpn
  • ¥15 悬赏Python-playwright部署在centos7上