use strict; use warnings; my @vals = (1, 2, 3, 4, 5); my $n = 3; my @solutions; nSum(\@vals, \@solutions, 0, -1, $n); print "@solutions\n"; sub nSum { my ($vals, $solutions, $sum, $i, $n) = @_; if (--$n) { nSum($vals, $solutions, $sum + $vals->[$_], $_, $n) for ($i+1)..$#$vals; } else { push @$solutions, $sum + $vals->[$_] for ($i+1)..$#$vals; } }