diff --git a/memo.scm b/memo.scm index a07136a7..66de1275 100644 --- a/memo.scm +++ b/memo.scm @@ -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))