in reply to Printing combinations, code review request
I came up with the below. Basically my intention was to avoid copying the arrays unless necessary.
#!/usr/bin/perl use strict; use warnings; my @list = (1 .. 5); my $take = 2; comb_demerphq(\@list, $take, []); sub comb_demerphq { my ($items,$group,$list)=@_; return _comb_demerphq([ @{ $items||[] } ],$ group, [ @{ $list||[] +} ] ); } sub _comb_demerphq { my ($items,$group,$list) = @_; unless ($group) { print "@$list\n"; } else { my @newlist = (@$list,undef); while (@$items) { $newlist[-1]=shift (@$items); _comb_demerphq([@$items], $group - 1, \@newlist); } } }
But i suspect that there are still better ways to improve this by using a different algorithm. Not sure what it is though.
|
---|