うむ。N=1000程度でスローダウンするのはやっぱりおかしい。
Scheme版
(define (memoise f)
(let ((m '()))
(lambda (x)
(cond ((assoc x m) => cdr)
(else
(let ((n (f x)))
(set! m (cons (cons x n) m))
n))))))
(define (fib x)
(if (<= x 1)
1
(+ (fib (- x 1)) (fib (- x 2)))))
(set! fib (memoise fib))
GaucheやscmだとN=10000でも大丈夫だし。 どこかおかしいに違いない。
と思ったらN=10000時にScheme 48
がheap overflowで死亡。
N=8000くらいならなんとか。
うーむ。
blog comments powered by Disqus