[Tutor] recursion

Alan Gauld alan.gauld at btinternet.com
Fri Feb 5 03:42:10 EST 2016

```On 05/02/16 02:03, noopy via Tutor wrote:

> I just cannot get my head around the following code, maybe someone could
> explain it to me.

I'll try but it is a little bit tricky.

> def permutations(items):
>      n = len(items)
>      if n==0: yield []
>      else:

I assume this bit is clear enough?

>          for i in range(len(items)):
>              for cc in permutations(items[:i]+items[i+1:]):
>                  yield [items[i]]+cc

This bit is where the tricky stuff happens.
The key is in the slicing of items.
items[:i]+items[i+1:] effectively removes item[i] from the list.
So the 'for cc' line is saying:
find the permutations of everything except item[i].
then add items[i] to each of those permutations.
So for a single element it returns that element plus the empty list.

The recursion then repeats that for the reduced list.
So using XYZ as in your code:
for the first iteration of XYZ
the first level calls for permutations of YZ and
the second level calls for permutations of Z followed by Y
It then yields X plus those permutations - XYZ, XZY
for the second iteration of XYZ
the first level calls for permutations of XZ and
the second level calls for permutations of Z followed by X
It then yields Y plus those permutations - YXZ, YZX
for the third iteration of XYZ
the first level calls for permutations of XY and
the second level calls for permutations of X followed by Y
It then yields Z plus those permutations - ZXY, ZYX

I may have the return orders wrong because I didn't actually run it.
But that's the basic concept.

> for p in permutations(list("XYZ")):
>      print(''.join(p))

And this loop just joins the list back into strings.

> I have a problem with the following understanding:
> when I am in the recursion and call "for cc in permutations("Z")", the
> next level of the recursion will do "for cc in permutations([])", which
> will yield an empty list.

Yes, but the previous level then yields Z plus an empty list.

> So although "for cc in permutations("Z")" does have an item it does
> "yield [items[i]]+cc" - thats the confusion for me. I hope I could
> express myself clearly.

It is confusing. Maybe the easiest way to see it would be to
run it in a debugger with a break point set on the for cc
loop and look at items each time it stops.

--
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/
http://www.amazon.com/author/alan_gauld
Follow my photo-blog on Flickr at:
http://www.flickr.com/photos/alangauldphotos

```