Unyeilding a permutation generator

sillyhat at yahoo.com sillyhat at yahoo.com
Mon Nov 3 17:45:17 EST 2008


On Nov 3, 4:24 pm, Michele Simionato <michele.simion... at gmail.com>
wrote:
> On Nov 2, 10:34 pm, silly... at yahoo.com wrote:
>
> > Anyway what I want to do is experiment with code similar to this (i.e.
> > same algorithm and keep the recursion) in other languages,
> > particularly vbscript and wondered what it would look like if it was
> > rewritten to NOT use the yield statement - or at least if it was
> > amended so that it can be easily translated to other languages that
> > dont have python's yield statement. I think the statement "for perm in
> > all_perms(str[1:]):"  will be hardest to replicate in a recursive
> > vbscript program for example.
>
> > Thanks for any constructive help given.
>
> Here is a solution which does not use yield, translittered
> from some Scheme code I have:
>
> def perm(lst):
>     ll = len(lst)
>     if ll == 0:
>         return []
>     elif ll == 1:
>         return [lst]
>     else:
>         return [[el] + ls for el in lst
>                 for ls in perm([e for e in lst if not e==el])]
>
> if __name__ == '__main__':
>     print perm('abcd')

Thats interesting code but seems to give a different output,
suggesting thet the underlying algorithm is different.
Ignoring linebreaks and case, the original code gives:
abcd bacd bcad bcda acbd cabd cbad cbda acdb cadb cdab cdba abdc badc
bdac bdca adbc dabc dbac dbca adcb dacb dcab dcba

The output from the above program, when converted to strings is:
abcd abdc acbd acdb adbc adcb bacd badc bcad bcda bdac bdca cabd cadb
cbad cbda cdab cdba dabc dacb dbac dbca dcab dcba

Cheers, Hal.



More information about the Python-list mailing list