Here's
pme's changes as the whole script.
use strict;
use warnings;
sub Solve {
my ( $goal, $elements ) = @_;
my ( @results, $RecursiveSolve, $nextValue );
$RecursiveSolve = sub {
my ( $currentGoal, $included, $index ) = @_;
for ( ; $index < @$elements ; ++$index ) {
$nextValue = $elements->[$index];
if ( $currentGoal > 2 * $nextValue ) {
$RecursiveSolve->(
$currentGoal - $nextValue,
[ @$included, $nextValue ],
$index + 1
);
}
else {
if ( $currentGoal == $nextValue ) {
#print join( ',', @$included, $nextValue ), "\n";
push @results, [ @$included, $nextValue ];
}
return if $nextValue >= $currentGoal;
}
}
};
$RecursiveSolve->( $goal, [], 0 );
undef $RecursiveSolve; # Avoid memory leak from circular refere
+nce
return @results;
}
my @results = Solve( 869,
[ 15, 43, 51, 56, 60, 67, 122, 152, 193, 204, +229, 271, 293, 301
+] );
foreach my $result (@results) {
print join(',',@$result),"\n";
}