Common Lisp, Scheme Part 14
レス数が900を超えています。1000を超えると表示できなくなるよ。
0928デフォルトの名無しさん
2006/06/04(日) 09:35:22速くはならない。2回目からめちゃ速いけど。下は gauche 用。
>>918 この問題なら、nCr = nCn-r で第二引数を小さくしてから、
nCr = nPr / r! を使う方がループ減る。
(define (memoize f)
(let ((tab (make-hash-table 'equal?)))
(lambda args
(let ((cached (hash-table-get tab args #f)))
(or cached
(let ((ret (apply f args)))
(hash-table-put! tab args ret)
ret))))))
(define choose-memo
(memoize
(lambda (m n)
(if (or (zero? n) (= m n))
1
(+ (choose-memo (- m 1) n) (choose-memo (- m 1) (- n 1)))))))
(define (choose-tail m n)
(let loop ((m m) (n (if (> n (/ m 2)) (- m n) n))
(mm 1) (nn 1))
(if (zero? n) (/ mm nn)
(loop (- m 1) (- n 1) (* mm m) (* nn n)))))
レス数が900を超えています。1000を超えると表示できなくなるよ。