fork download
  1. ; matrix search
  2.  
  3. (define (bsearch lt? x xs)
  4. (let loop ((lo 0) (hi (- (vector-length xs) 1)) (result #f))
  5. (let ((mid (+ lo (quotient (- hi lo) 2))))
  6. (cond ((< hi lo) result)
  7. ((lt? x (vector-ref xs mid)) (loop lo (- mid 1) result))
  8. ((lt? (vector-ref xs mid) x) (loop (+ mid 1) hi result))
  9. (else (loop lo (- mid 1) mid))))))
  10.  
  11. (define (vector-row r mat) (vector-ref mat r))
  12.  
  13. (define (matsearch lt? x mat)
  14. (let ((len (vector-length mat)))
  15. (let loop ((r 0))
  16. (cond ((= r (vector-length mat)) #f)
  17. ((bsearch lt? x (vector-row r mat)) =>
  18. (lambda (c) (list r c)))
  19. (else (loop (+ r 1)))))))
  20.  
  21. (define mat '#(#(2 5 8) #(1 4 7) #(3 6 9)))
  22. (display (matsearch < 8 mat)) (newline)
  23. (display (matsearch < 6 mat)) (newline)
  24. (display (matsearch < 0 mat)) (newline)
Success #stdin #stdout 0.02s 8248KB
stdin
Standard input is empty
stdout
(0 2)
(2 1)
#f