Download | Plain Text | No Line Numbers


  1. #!/usr/bin/perl
  2.  
  3. use POSIX qw(ceil floor);
  4. use strict;
  5. use Data::Dumper;
  6.  
  7. my @a = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20);
  8. #my @a = (0, 1, 2);
  9.  
  10. sub expSearch
  11. {
  12. my ($a, $l, $r, $k) = @_;
  13. print "left=$l, right=$r", $/;
  14.  
  15. if ($k < $a[$l] || $k > $a[$r])
  16. {
  17. print "not found1", $/;
  18. return;
  19. }
  20. if ($a[$l] == $k)
  21. {
  22. print "found2=", $l, $/;
  23. return;
  24. }
  25.  
  26. my $i = 1;
  27. while($l+$i < $r && $k > $a[$l+$i])
  28. {
  29. $i = 2*$i;
  30. }
  31. if (($l+$i) > $r)
  32. {
  33. print "a2[", $l+floor($i/2), "...", $r, "]", $/;
  34. return expSearch($a, $l+floor($i/2), $r, $k);
  35. }
  36. print $l+$i, $/;
  37. if ($k == $a[$l+$i])
  38. {
  39. print "found=", $l+$i, $/;
  40. return;
  41. }
  42. print "a1[", $l+floor($i/2), "...", $l+$i, "]", $/;
  43. return expSearch($a, $l+floor($i/2), $l+$i, $k);
  44. }
  45.  
  46. print scalar(@a), $/;
  47. expSearch(\@a, 0, scalar(@a)-1, $ARGV[0]);
  48.