# Recursive function to develop permutations

Steven Bethard steven.bethard at gmail.com
Thu Oct 21 08:20:25 CEST 2004

```Steve Goldman <steve_g <at> ix.netcom.com> writes:

> But now I have another question.  In the elegant recursive generator, below,
> the yield expression for the terminating condition is followed by a return
> statement.  Why is that necessary?
[snip]
> > def permute(Xs, N):
> >     if N <= 0:
> >         yield []
> >         return
> >     for x in Xs:
> >         for sub in permute(Xs, N-1):
> >             yield [x]+sub

The 'return' statement tells the generator to exit the function (without
saving the state.  So,

>>> def gen():
... 	yield 1
... 	return
... 	yield 2
...
>>> list(gen())
[1]

Note that the second yield is never reached.  So the source of your example
above chose to use the 'return' statement instead of the perhaps more
intuitive (but slightly more indented):

def permute(Xs, N):
if N <= 0:
yield []
else:
for x in Xs:
for sub in permute(Xs, N-1):
yield [x]+sub

Steve

```