Python-рекурсия с итераторами (странное поведение) - PullRequest
0 голосов
/ 04 ноября 2019

Я написал этот код, чтобы попытаться понять, что происходит.

Может кто-нибудь помочь мне понять, почему генератор не вызывает себя рекурсивно? Как написать рекурсивные генераторы?

def f_yield(n):
    print(n)
    if n < 5:
        yield n
    else:
        yield f_yield(n-3)

def f_return(n):
    print(n)
    if n < 5:
        return n
    else:
        return f_return(n-3)

[i for i in f_yield(12)]
# prints 12 

f_return(12)
# prints 12 9 6 3

Ответы [ 2 ]

3 голосов
/ 04 ноября 2019

Как отметил Хелвуд, f_yield(n-3) также является итератором, поэтому он не возвращается, если вы не выполните итерацию по нему. Если вы добавите yield from, рекурсия начнет работать:

def f_yield(n):
    print(n)
    if n < 5:
        yield n
    else:
        yield from f_yield(n-3)
2 голосов
/ 04 ноября 2019

Вам нужно перебрать f_yield(n-3). Вы можете использовать yield from для этого:

yield from f_yield(n-3)
...