You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成器中使用递归是否有特殊行为?为何递归生成器仅输出4?

递归生成器为何只输出4?

先看你给出的普通递归函数:

def generator_recursion(n):
    if n < 0:
        return
    else:
        generator_recursion(n-1)
        print(n)
    
generator_recursion(4)

这段代码里,调用generator_recursion(n-1)会直接执行函数逻辑——递归到n=-1返回后,会从n=0开始依次执行print(n),所以能输出0、1、2、3、4。

但生成器版本的问题出在生成器的核心特性上:调用生成器函数不会立即执行函数体,只会返回一个生成器迭代器对象。你的生成器代码:

def generator_recursion(n):
    if n < 0:
        return
    else:
        generator_recursion(n-1)  # 仅创建生成器对象,未迭代激活
        yield n
    
gr = generator_recursion(4)
for k in gr:
   print(k)

当你调用generator_recursion(n-1)时,只是创建了对应n值的生成器对象,但没有对这个对象做迭代操作,它内部的递归逻辑和yield语句都不会触发。只有当你迭代最外层的gr(对应n=4的生成器)时,才会执行到yield n,输出4;而递归过程中创建的n=3、2、1、0的生成器都没被激活,自然不会产生任何输出。

要让递归生成器正常产出所有值,需要迭代递归返回的子生成器,推荐用yield from语法:

def generator_recursion(n):
    if n < 0:
        return
    else:
        yield from generator_recursion(n-1)  # 迭代子生成器,传递所有产出值
        yield n
    
gr = generator_recursion(4)
for k in gr:
   print(k)

这段代码会输出0、1、2、3、4。yield from的作用是把子生成器的所有产出值直接传递给当前生成器的调用者,等价于手动循环子生成器并逐个yield:

def generator_recursion(n):
    if n < 0:
        return
    else:
        for num in generator_recursion(n-1):
            yield num
        yield n

内容的提问来源于stack exchange,提问作者FerntreeGuy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:20:10