#!/usr/bin/perl # https://perlmonks.org/?node_id=11102502 use strict; use warnings; my @input = qw/ 2 5 7 /; my $target = 15; print "\ntarget $target from @input\n"; find( 0, [], $target, @input ); print "That's all, folks\n"; $target = 3; print "\ntarget $target from @input\n"; find( 0, [], $target, @input ); print "That's all, folks\n"; $target = 35; print "\ntarget $target from @input\n"; find( 0, [], $target, @input ); print "That's all, folks\n"; sub find { my ($sum, $sofar, $want, @numbers ) = @_; if( $sum == $want ) { print "@$sofar\n"; } elsif( $sum < $want and @numbers and $numbers[0] > 0 ) { find( $sum + $numbers[0], [ @$sofar, $numbers[0] ], $want, @numbers ); find( $sum, $sofar, $want, @numbers[1..$#numbers] ); } }