[racket] Math - factorial.rkt, binomial.rkt and memoization

From: Matthew Flatt (mflatt at cs.utah.edu)
Date: Tue Apr 9 08:42:05 EDT 2013

At Tue, 9 Apr 2013 14:02:27 +0200, Laurent wrote:
> But if you write all 10 cases, aren't the lists constructed anyway before
> calling `*'?

Applying `*' to N arguments doesn't construct a list of N arguments.
There's a continuation frame that accumulates the N arguments, but in a
way that tends to be much more efficient for the purposes of
constructing a function call.

For `(partial-factorial 0 1000000)', the difference doesn't matter,
since the 100000 or so bignum multiplications dominate. But I'd write

     (for/fold ([v 1]) ([p (in-range (+ m 1) (+ n 1))])
       (* v p))

or even

     (for/product ([p (in-range (+ m 1) (+ n 1))]) p)

Posted on the users mailing list.