1. (define (memoize func)
  2.  (let ((known (make-table)))
  3.    (lambda args
  4.      (let ((remembered (table-ref known args #f)))
  5.        (if remembered
  6.            (car remembered)
  7.            (let ((learned (apply func args)))
  8.              (table-set! known args (list learned))
  9.              learned))))))
  10. (define-macro (memoize! f)
  11.  `(set! ,f (memoize ,f)))
  12. (define (steve days off-by l)
  13.  (if (zero? days)
  14.      (list off-by)
  15.      (if (null? l)
  16.          #f
  17.          (let ((first-try (steve (- days 1) (+ off-by (car l)) (cdr l)))
  18.                (second-try (steve days off-by (cdr l))))
  19.            (if (not first-try)
  20.                second-try
  21.                (let ((first-fixed (cons (car first-try)
  22.                                         (cons (car l)
  23.                                               (cdr first-try)))))
  24.                  (if (or (not second-try)
  25.                          (< (abs (car first-try)) (abs (car second-try))))
  26.                      first-fixed
  27.                      second-try)))))))
  28. (memoize! steve)
  29. (define (answer days list-of-days)
  30.  (cdr (steve days 0 list-of-days)))
  31. (time (answer 9 '(-50 -21 13 171 14 -42 -58 109 4 7 -23 -44 -98 -121
  32. 101 33 87 -121 -40 -65 43 54 -45 -12 -12 38 25 3 7 8)))
  33.    3167 ms real time
  34.    1829 ms cpu time (1703 user, 126 system)
  35.    8 collections accounting for 912 ms real time (450 user, 31 system)
  36.    25226416 bytes allocated
  37.    no minor faults
  38.    no major faults
  39. (87 -40 -65 54 -45 -12 -12 25 8)
  40. View this file Here (Right Click and save As)