i’m a a programmer, i do some C# perl and python,
anyways, i found this recursive code to generate permutations, of a list of symbols and letters, but i can’t figure out how it works? can anyone care to explain it please?
#!/usr/bin/env python
#-*- coding:utf-8 -*-
def generate(charlist,state,position):
for i in charlist:
state[position] = i
if position == (len(state)-1):
print "".join(state)
else:
generate(charlist,state,position+1)
generate("1234567890qwertyuiopasdfghjklzxcvbnm",[None]*8,0)
here is the code, with all correct spacing.
This does not generate permutations. It generates n-dimensional cartesian products. (In the process, it also generates all permutations, but the algorithm to generate only permutations would be different.)
It’s a bit difficult to explain how it works, but if you look at the output for small input, you can see what’s going on. Consider the output for
'abc'and[None] * 3(I modified the code to act as a true generator):As you can see, what happens is that initially,
generatecalls itself three times, incrementingpositioneach time (from0to1to2). Each time through the recursion-loop, it puts'a'in the current position and tests to see if it has reached the end of thestatelist. If so, it yields the result and does not call itself.In this case, when that happens,
position == 2. Now theforloop kicks in, storing'b'and'c'instate[2]and yielding each of those states. Then the function ends, and control is returned to the caller, for whichposition == 1. The caller then continues through its for loop; it setsstate[1] = 'b'and then, sincepositionis no longer at the end of thestatelist, it calls itself again… nowposition == 2and the for loop setsstate[2] == 'a','b','c', and so on.By the way, if you want to compute cartesian products in python, here’s a nice way that doesn’t require your readers to parse out a recursive algorithm:
You could also do