fork download
  1. ; fibonacci search
  2.  
  3. (define (filter pred? xs)
  4. (let loop ((xs xs) (ys '()))
  5. (cond ((null? xs) (reverse ys))
  6. ((pred? (car xs))
  7. (loop (cdr xs) (cons (car xs) ys)))
  8. (else (loop (cdr xs) ys)))))
  9.  
  10. (define (range . args)
  11. (case (length args)
  12. ((1) (range 0 (car args) (if (negative? (car args)) -1 1)))
  13. ((2) (range (car args) (cadr args) (if (< (car args) (cadr args)) 1 -1)))
  14. ((3) (let ((le? (if (negative? (caddr args)) >= <=)))
  15. (let loop ((x(car args)) (xs '()))
  16. (if (le? (cadr args) x)
  17. (reverse xs)
  18. (loop (+ x (caddr args)) (cons x xs))))))
  19. (else (error 'range "unrecognized arguments"))))
  20.  
  21. (define ps '#(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47))
  22.  
  23. (define (bsearch lt? x xs)
  24. (let ((len (vector-length xs)))
  25. (let loop ((lo 0) (hi (- len 1)))
  26. (if (< hi lo) -1
  27. (let ((mid (quotient (+ lo hi) 2)))
  28. (cond ((lt? x (vector-ref xs mid))
  29. (loop lo (- mid 1)))
  30. ((lt? (vector-ref xs mid) x)
  31. (loop (+ mid 1) hi))
  32. (else mid)))))))
  33.  
  34. (display "bsearch") (newline)
  35. (display (bsearch < 23 ps)) (newline)
  36. (display (bsearch < 45 ps)) (newline)
  37. (display (filter (lambda (x) (not (negative? x)))
  38. (map (lambda (p) (bsearch < p ps)) (range 50)))) (newline)
  39.  
  40. (define fib ; (fib n) returns nth fibonacci number, n < 52
  41. (let ((fibs (let loop ((k 50) (fibs (list 1 0)))
  42. (if (zero? k) (list->vector (reverse fibs))
  43. (loop (- k 1) (cons (+ (car fibs) (cadr fibs)) fibs))))))
  44. (lambda (n) (vector-ref fibs n))))
  45.  
  46. (define (fsearch lt? x xs)
  47. (let* ((len (vector-length xs))
  48. (k (do ((k 0 (+ k 1)))
  49. ((<= len (fib k)) (- k 1)))))
  50. (let loop ((lo 0) (hi (- len 1)) (k k))
  51. (if (not (positive? k)) -1
  52. (let ((mid (min (+ lo (fib (- k 1))) hi)))
  53. (cond ((lt? x (vector-ref xs mid))
  54. (loop lo mid (- k 2)))
  55. ((lt? (vector-ref xs mid) x)
  56. (loop mid hi (- k 1)))
  57. (else mid)))))))
  58.  
  59. (display "fsearch") (newline)
  60. (display (fsearch < 23 ps)) (newline)
  61. (display (fsearch < 45 ps)) (newline)
  62. (display (filter (lambda (x) (not (negative? x)))
  63. (map (lambda (p) (fsearch < p ps)) (range 50)))) (newline)
  64.  
  65. (define (gsearch lt? x xs)
  66. (define (gsection lo hi)
  67. (let ((phi (/ (+ 1 (sqrt 5)) 2)))
  68. (+ (inexact->exact (round
  69. (/ (- hi lo) phi))) lo)))
  70. (let ((len (vector-length xs)))
  71. (let loop ((lo 0) (hi (- len 1)))
  72. (if (< hi lo) -1
  73. (let ((mid (gsection lo hi)))
  74. (cond ((lt? x (vector-ref xs mid))
  75. (loop lo (- mid 1)))
  76. ((lt? (vector-ref xs mid) x)
  77. (loop (+ mid 1) hi))
  78. (else mid)))))))
  79.  
  80. (display "gsearch") (newline)
  81. (display (gsearch < 23 ps)) (newline)
  82. (display (gsearch < 45 ps)) (newline)
  83. (display (filter (lambda (x) (not (negative? x)))
  84. (map (lambda (p) (gsearch < p ps)) (range 50)))) (newline)
Success #stdin #stdout 0.01s 7364KB
stdin
Standard input is empty
stdout
bsearch
8
-1
(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14)
fsearch
8
-1
(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14)
gsearch
8
-1
(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14)