my @res = (2, 2, 2, 5, 5, 5); my $goal = 1000; print closest($goal, \@res), "\n"; sub closest{ my $exact = shift; my $array = shift; my $best = 0; for my $n ( get_numbers($array) ){ $best = $n if abs( $exact - $n**2) < abs( $exact - $best**2); } $best; } sub get_numbers{ my $array = shift; my $length = @$array; if ($length == 1){ return ( $array->[0] ); } else{ my @ret_arr; my $n = shift @$array; push @ret_arr, $n; my @tmp = get_numbers($array); push @ret_arr, @tmp; push @ret_arr, $n*$_ for @tmp; prune(@ret_arr); } } sub prune{ my %h; undef $h{$_} for @_; keys %h; }