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)
; Original versions:
(define (ack m n)
(cond ((= m 0) (+ n 1))
((= n 0) (ack (- m 1) 1))
(else (ack (- m 1) (ack m (- n 1))))))
(define (fib n)
(if (< n 2)
n
(+ (fib (- n 1))
(fib (- n 2)))))
;(define (ack m n)
; (cond ((= m 0) (+ n 1))
; ((= n 0) (ack (- m 1) 1))
; (else (ack (- m 1) (ack m (- n 1))))))
;(define (fib n)
; (if (< n 2)
; n
; (+ (fib (- n 1))
; (fib (- n 2)))))
; Fast versions:
;(define ack (memoize _ack))
@ -50,6 +50,28 @@
; (+ (fib (- n 1))
; (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))
(newline)
(write (fib 40))