Brute-force algorithm: sub is_power { # Some algorithm to determine if a number is a power of two. } sub closest_power_of_two_brute { my $m = my $n = shift; return $n if is_power( $n, 2 ); while (1) { return $n if is_power( $++n, 2 ); return $m if is_power( $--m, 2 ); } } #### Predictive algorithm: sub iterate_over { my $v = shift; return sub { $v *= $v; }; } sub closest_power_of_two_predictive { my $n = shift; my $it = iterate_over( 2 ); my $l = $it->(); while ( my $v = $it->() ) { last if $v > $n; $l = $v; } abs( $n - $l ) > abs( $n - $v ) ? $v : $l; }