Memoized functions that do not require new top-level definitions

This commit is contained in:
Justin Ethier 2019-02-05 17:20:31 -05:00
parent 20ee239b59
commit 411c589133

View file

@ -26,15 +26,15 @@
(write (mfnc 1 1)) (newline) (write (mfnc 1 1)) (newline)
; Original versions: ; Original versions:
(define (ack m n) ;(define (ack m n)
(cond ((= m 0) (+ n 1)) ; (cond ((= m 0) (+ n 1))
((= n 0) (ack (- m 1) 1)) ; ((= n 0) (ack (- m 1) 1))
(else (ack (- m 1) (ack m (- n 1)))))) ; (else (ack (- m 1) (ack m (- n 1))))))
(define (fib n) ;(define (fib n)
(if (< n 2) ; (if (< n 2)
n ; n
(+ (fib (- n 1)) ; (+ (fib (- n 1))
(fib (- n 2))))) ; (fib (- n 2)))))
; Fast versions: ; Fast versions:
;(define ack (memoize _ack)) ;(define ack (memoize _ack))
@ -50,6 +50,28 @@
; (+ (fib (- n 1)) ; (+ (fib (- n 1))
; (fib (- n 2))))) ; (fib (- n 2)))))
;; New fast versions that do not introduce any new top-level definitions
(define ack
((lambda ()
(define (_ack m n)
(cond ((= m 0) (+ n 1))
((= n 0) (__ack (- m 1) 1))
(else (__ack (- m 1) (__ack m (- n 1))))))
(define __ack (memoize _ack))
__ack
)))
(define fib
((lambda ()
(define (_fib n)
(if (< n 2)
n
(+ (__fib (- n 1))
(__fib (- n 2)))))
(define __fib (memoize _fib))
__fib
)))
(write (ack 3 12)) (write (ack 3 12))
(newline) (newline)
(write (fib 40)) (write (fib 40))