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.  
  9. sub expSearch
  10. {
  11. my ($a, $l, $r, $k) = @_;
  12. print "left=$l, right=$r", $/;
  13.  
  14. if ($a[$l] == $k)
  15. {
  16. print "found2=", $l, $/;
  17. return;
  18. }
  19. if ($l >= $r)
  20. {
  21. print "not found", $/;
  22. return;
  23. }
  24.  
  25. my $i = 1;
  26. while($l+$i < $r && $k > $a[$l+$i])
  27. {
  28. $i = 2*$i;
  29. }
  30. if ($k == $a[$l+$i])
  31. {
  32. print "found=", $l+$i, $/;
  33. return;
  34. }
  35. if (($l+$i) > $r)
  36. {
  37. print "a2[", $l+floor($i/2) + 1, "...", $r, "]", $/;
  38. return expSearch($a, $l+floor($i/2) + 1, $r, $k);
  39. }
  40. print "a1[", $l+floor($i/2)+1, "...", $l+$i-1, "]", $/;
  41. return expSearch($a, $l+floor($i/2)+1, $l+$i-1, $k);
  42. }
  43.  
  44. print scalar(@a), $/;
  45. expSearch(\@a, 0, scalar(@a), $ARGV[0]);
  46.