use strict; use warnings; my $amount = 16; my $coinset = [5,2]; { my $Exception = 0; sub change { my ($cset, $amt) = @_; if ($amt == 0) { return [] } if (@$cset == 0) { $Exception = 1; return [] } my $coin = shift @$cset; if ($coin > $amt) { print "$coin > $amt\n"; return [change($cset, $amt)]; } else { print "Checking $amt - $coin\n"; my $rval = [$coin, @{change( [$coin, @$cset], $amt - $coin )}]; if ($Exception) { print "Exception forces backing up to $amt\n"; $Exception = 0; $rval = [@{change($cset, $amt)}]; } return $rval; } } } use Data::Dumper; print Dumper(change($coinset, $amount)), "\n";