Продолжение http://friendfeed.com/kkapp/b5d3658c.
Уложился быстрее чем вчера, потому что помню, что код упрощается, если границы двигать не на середину, как положено по книжкам, а сразу за неё ($mid ± 1).
#! /usr/bin/perl use strict; use warnings; use Test::Most; use Data::Dump; sub bsearch { my ($what, @where) = @_; my ($left, $right) = (0, $#where); while ($right >= $left) { my $mid = int(($right - $left) / 2) + $left; if ($where[$mid] == $what) { return $mid; } elsif ($where[$mid] < $what) { $left = $mid + 1; } else { $right = $mid - 1; } } return -1; } is(bsearch(0, 0), 0); is(bsearch(0, 1), -1); is(bsearch(1, 1), 0); is(bsearch(1, 1, 2, 3), 0); is(bsearch(1, -6, -5, 1, 2, 3), 2); is(bsearch(0, -6, -5, -3, -1, 0), 4); is(bsearch(3, 0, 0, 0, 0, 0, 0, 3), 6); is(bsearch(4, 0, 0, 0, 0, 0, 0, 3), -1); is(bsearch(1), -1); done_testing;