use Inline 'C';
use Benchmark 'cmpthese';
cmpthese( 1_000_000, { iterative_c => sub{guess_it_c(4999,1,10000)},
recursive_c => sub{guess_rec_c(4999,1,10000)},
iterative_p => sub{guess_it_p(4999,1,10000)},
recursive_p => sub{guess_rec_p(4999,1,10000)},}
+);
sub guess_it_p {
my ( $ans, $lower, $higher ) = @_;
my $guess;
while(1) {
$guess = int(($lower + $higher)/2);
last if $ans == $guess;
if ( $guess > $ans ) {
$higher = $guess -1;
}
else {
$lower = $guess +1;
}
}
return $guess;
}
sub guess_rec_p {
my ( $ans, $lower, $higher ) = @_;
my $guess = int(($lower + $higher)/2);
if ($ans == $guess) {
return $guess;
}
if ( $guess > $ans ) {
guess_rec_p( $ans, $lower, $guess -1 );
}
else {
guess_rec_p( $ans, $guess +1, $higher );
}
}
__END__
__C__
int guess_it_c( int ans, int lower, int higher ) {
int guess;
for(;;) {
guess = (int)((lower + higher)/2);
if ( ans == guess ) break;
if ( guess > ans )
higher = guess -1;
else
lower = guess +1;
}
return guess;
}
int guess_rec_c( int ans, int lower, int higher ) {
int guess;
guess = (int)((lower + higher)/2);
if (ans == guess) return guess;
if ( guess > ans ) {
guess_rec_c( ans, lower, guess -1 );
}
else {
guess_rec_c( ans, guess +1, higher );
}
}