blob: a95b7ab56894ae8b61efec99c474f7ef9bbcc220 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
;;;; Under Creative Commons Attribution-ShareAlike 4.0
;;;; International. See
;;;; <https://creativecommons.org/licenses/by-sa/4.0/>.
(define-module (one eleven)
#:export (recursive-fn
make-cache
alt-recursive-fn))
(define (recursive-fn n)
(cond ((<= n 3) n)
(else (+ (* 1 (recursive-fn (- n 1)))
(* 2 (recursive-fn (- n 2)))
(* 3 (recursive-fn (- n 3)))))))
;;;; alternative version. faster but ugly.
(define (make-cache)
(let ((cache (make-hash-table)))
(define (get key)
(hash-get-handle cache key))
(define (set key value)
(hash-create-handle! cache key value)
;; return value as a side effect.
value)
(lambda args
(apply (case (car args)
((get) get)
((set) set)
(else (error "Invalid method")))
(cdr args)))))
(define (alt-recursive-fn cache n)
(let ((v (cache 'get n)))
(cond (v (cdr v))
((<= n 3)
(cache 'set n n))
(else (cache 'set n
(+ (* 1 (alt-recursive-fn cache (- n 1)))
(* 2 (alt-recursive-fn cache (- n 2)))
(* 3 (alt-recursive-fn cache (- n 3)))))))))
|