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