; consecutive array search
(define (f x xs) ; unsorted
(let loop ((xs xs))
(cond ((or (null? xs) (null? (cdr xs))) (list))
((= (+ (car xs) (cadr xs)) x) (list (car xs) (cadr xs)))
(else (loop (cdr xs))))))
(display (f 7 '(4 6 2 5 1 3 7))) (newline)
(display (f 7 '(4 6 5 1 2 3 7))) (newline)
(define (bsearch lt? x xs)
(let loop ((lo 0) (hi (- (vector-length xs) 1)))
(let ((mid (+ lo (quotient (- hi lo) 2))))
(cond ((< hi lo) #f)
((lt? x (vector-ref xs mid)) (loop lo (- mid 1)))
((lt? (vector-ref xs mid) x) (loop (+ mid 1) hi))
(else mid)))))
(define (f x xs) ; sorted
(let ((i (bsearch < (quotient x 2) xs)))
(if (and i (= (+ (vector-ref xs i) (vector-ref xs (+ i 1))) x))
(list (vector-ref xs i) (vector-ref xs (+ i 1)))
(list))))
(display (f 7 '#(1 2 3 4 5 6 7))) (newline)
(display (f 6 '#(1 2 3 4 5 6 7))) (newline)