>>919 メモは所詮キャッシュだから劇的に速くなるけど、本質的には
速くはならない。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)))))