the code should work :). I wouldn't consider myself a programmer (get out clause?), but I did have a go and I failed (with my first attempt) -- basically because I was never going to get anywhere without testing. If interested, I've documented my attempts on my website. I think I pretty much got there in the end. @Eugene Wallingford: "(search-in-range key v middle upper)" should probably be "(search-in-range key v (+ middle 1) upper)" since there is no need to keep the middle element around, but the code looks good otherwise. I started a version in Common Lisp and FAILED! Not that I'm ignorant in Lisp though I'm far from an expert, but that I've dealt with this recently in Smalltalk, and misremembered stuff. Also I've been under fair stress with my heart dog being sick with colitis and no clear diagnosis or cure in view. I've not had this sort of anguish since my dad died of cancer. Stress plays havoc with concentration. One thing I note is that few is any of these answers deal with the question: "what comes before 'elephant?'" Sometimes it's useful to note the insertion index if you fail to find something. In languages like Scheme and Lisp, you'd use (values ...) to return an index and whether it was a find or insertion point. I had 10 minutes to kill at work, so... here's a C# version that uses recursion. It returns -1 if the item was not found. Couldn't be bothered