fork download
  1. ; consecutive array search
  2.  
  3. (define (f x xs) ; unsorted
  4. (let loop ((xs xs))
  5. (cond ((or (null? xs) (null? (cdr xs))) (list))
  6. ((= (+ (car xs) (cadr xs)) x) (list (car xs) (cadr xs)))
  7. (else (loop (cdr xs))))))
  8.  
  9. (display (f 7 '(4 6 2 5 1 3 7))) (newline)
  10. (display (f 7 '(4 6 5 1 2 3 7))) (newline)
  11.  
  12. (define (bsearch lt? x xs)
  13. (let loop ((lo 0) (hi (- (vector-length xs) 1)))
  14. (let ((mid (+ lo (quotient (- hi lo) 2))))
  15. (cond ((< hi lo) #f)
  16. ((lt? x (vector-ref xs mid)) (loop lo (- mid 1)))
  17. ((lt? (vector-ref xs mid) x) (loop (+ mid 1) hi))
  18. (else mid)))))
  19.  
  20. (define (f x xs) ; sorted
  21. (let ((i (bsearch < (quotient x 2) xs)))
  22. (if (and i (= (+ (vector-ref xs i) (vector-ref xs (+ i 1))) x))
  23. (list (vector-ref xs i) (vector-ref xs (+ i 1)))
  24. (list))))
  25.  
  26. (display (f 7 '#(1 2 3 4 5 6 7))) (newline)
  27. (display (f 6 '#(1 2 3 4 5 6 7))) (newline)
Success #stdin #stdout 0.01s 7908KB
stdin
Standard input is empty
stdout
(2 5)
()
(3 4)
()