[Tutor] Recursive combinations?
Remco Gerlich
scarblac@pino.selwerd.nl
Wed, 15 Aug 2001 12:26:29 +0200
On 0, Andrew Wilkins <toodles@yifan.net> wrote:
> I'm trying to make combinations of 2 out of a set {1,2,3,...,n}
> I can do it for a predefined set where n=10 using the following:
>
> part1=[]
>
> for a in range(1,11):
> for b in range(a+1,11):
> part1.append((a,b))
>
> Is there some way I can make a recursive function so this combination
> function can be extended where the amount of items in a combination could be
> larger? For example for 3 items I'd just add another nested loop:
>
> part1=[]
>
> for a in range(1,11):
> for b in range(a+1,11):
> for c in range(b+1,11)
> part1.append((a,b,c))
>
> There's an obvious pattern, so that's why I thought of recursion. However I
> can't seem to get my head around recursion, even after going through and
> understanding Alan Gauld's tutorial on it.
>
> (By the way, _no_ this isn't for homework *grin*)
In the case of n == 0, there is a single combination, ().
The combinations of length n (n > 0) are just the combinations of length
n-1, with to each added the numbers 1 to n (either at the beginning or the
end).
so something like (no error checking done on the input, not tested):
def combinations(length, n):
if length == 0:
return [()] # Single combination, the empty one
return [ (i,)+combination for combination in combinations(length-1, n)
for i in range(1, n+1) ]
Excuses for the overly functional style - though it's quite neat in
this case :-).
Hmm. I just thought of ways to write that as a lambda. And I've never even
written Lisp, and no Haskell in years. Time to go write Python again :)
(Hi all, was disinterested for a while because of being busy etc, think
I'll be back now)
--
Remco Gerlich