OK
stevieb, here is the original OP code with only the print statement corrected as described in my first post. A sample execution demonstrates that the expected output is produced.
>type pviki.pl
use strict;
use warnings;
sub Solve
{
my ($goal, $elements) = @_;
# For extra speed, you can remove this next line
my (@results, $RecursiveSolve, $nextValue);
$RecursiveSolve = sub {
my ($currentGoal, $included, $index) = @_;
for ( ; $index < @$elements; ++$index) {
$nextValue = $elements->[$index];
# Since elements are sorted, there's no point in trying a
# non-final element unless it's less than goal/2:
if ($currentGoal > 2 * $nextValue) {
$RecursiveSolve->($currentGoal - $nextValue,
[ @$included, $nextValue ],
$index + 1);
} else {
#print "@$_\n", [ @$included, $nextValue ]
local $, = q(, );
print @$included, $nextValue, "\n"
if $currentGoal == $nextValue;
return if $nextValue >= $currentGoal;
}
} # end for
}; # end $RecursiveSolve
$RecursiveSolve->($goal, [], 0);
undef $RecursiveSolve; # Avoid memory leak from circular reference
return @results;
} # end Solve
my @results = Solve(869, [15, 43, 51, 56, 60, 67, 122, 152, 193, 204,
+229, 271, 293, 301]
);
>perl pviki.pl
15, 43, 51, 56, 60, 122, 229, 293,
15, 43, 51, 56, 204, 229, 271,
15, 43, 51, 67, 193, 229, 271,
15, 43, 51, 122, 152, 193, 293,
15, 56, 60, 67, 122, 152, 193, 204,
15, 56, 60, 122, 152, 193, 271,
15, 56, 204, 293, 301,
15, 67, 193, 293, 301,
43, 51, 56, 67, 122, 229, 301,
43, 51, 56, 67, 152, 229, 271,
43, 51, 60, 193, 229, 293,
43, 122, 204, 229, 271,
56, 60, 67, 122, 271, 293,
56, 67, 152, 293, 301,