python-3.x 生成器递归

eblbsuwk  于 2023-03-24  发布在  Python
关注(0)|答案(2)|浏览(102)

在generator中使用递归时是否有一些特殊的行为?
我可以通过以下代码打印0,1,2,3,4:

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

但当我改变到发电机像下面的代码,它只打印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)
vatpfxk5

vatpfxk51#

你需要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

​
ee7vknir

ee7vknir2#

你必须从递归子进程yield-

def generator_recursion(n):
    if n < 0:
        return
    else:
        for k in generator_recursion(n-1): # ✅ for k in sub-process
            yield k  # ✅ yield sub-process values
        yield n

因为generator_recursion是从递归调用中正确地yield ing出来的,所以现在您将看到正确的输出-

gr = generator_recursion(4)
for k in gr:
   print(k)

正如您所了解的,这正是yield from …所实现的-

def generator_recursion(n):
    if n < 0:
        return
    else:
        yield from generator_recursion(n-1) # ✅ equivalent to above
        yield n

相关问题