#!perl use strict; use warnings; use feature 'experimental::signatures'; use Memoize; my @values = (0,0,0,1,2,3,4,5,10,101,102,103); my $MIN = 1; my $MAX = 10; # this is the slow part: sub get_element_value( $index ) { sleep 1; return $values[$index] }; # Cache indices that we have fetched once already memoize 'get_element_value'; sub get_index_of_element_larger_than( $value, $low, $high ) { my $next_try = int(($low+$high) / 2); my $v = get_element_value( $next_try ); if( $v > $value ) { return get_index_of_element_larger_than( $low, $next_try-1 ); } else { return get_index_of_element_larger_than( $next_try+1, $high ); } }