math is hard (to remember)

Randal L. Schwartz merlyn at
Thu Jul 12 22:51:27 CDT 2001

>>>>> "cabney" == cabney  <cabney at> writes:

cabney> ~sdpm~
cabney> Anyone have a more succinct way to do this?  Or... faster?  I'm no compsci
cabney> guy, but my guess is this is O(NlogN).

cabney> =8<===============================================
cabney> #! /usr/bin/perl -w
cabney> # Finds all the different ways of combining N items, excluding the empty
cabney> # set.  So, 2**N - 1 combinations.

Here's one way that involves more recursion than iteration.  I've come
up with ways that involve more iteration than recursion too. :)

my @list = qw(red orange yellow green blue);
combo([], @list);
sub combo {
  my $base = shift;
  if (@_) {
    my $first = shift;
    combo($base, @_);
    combo([@$base, $first], @_);
  } else {
    print "@$base\n" if @$base; # skip null set

Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn at> <URL:>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See for onsite and open-enrollment Perl training!

The posting address is: san-diego-pm-list at

List requests should be sent to: majordomo at

If you ever want to remove yourself from this mailing list,
you can send mail to <majordomo at> with the following
command in the body of your email message:

    unsubscribe san-diego-pm-list

If you ever need to get in contact with the owner of the list,
(if you have trouble unsubscribing, or have questions about the
list itself) send email to <owner-san-diego-pm-list at> .
This is the general rule for most mailing lists when you need
to contact a human.

More information about the San-Diego-pm mailing list