Search code examples
pythonrecursiongenerator

Python: can generators be recursive?


My recursive generator doesn't work:

def recursive_generator(list_):
    yield list_[0]
    recursive_generator(list_[1:])

for k in recursive_generator([6,3,9,1]):
    print(k)

Expected output:

6
3
9
1

Actual output:

6

How do I fix this? I'm trying to transfer the yield command to the stack level above in the recursion.


Solution

  • Try this:

    def recursive_generator(lis):
        yield lis[0]
        yield from recursive_generator(lis[1:])
    
    for k in recursive_generator([6,3,9,1]):
        print(k)
    

    I should point out this doesn't work because of a bug in your function. It should probably include a check that lis isn't empty, as shown below:

    def recursive_generator(lis):
        if lis:
            yield lis[0]
            yield from recursive_generator(lis[1:])
    

    In case you are on Python 2.7 and don't have yield from, check this question out.