Infinitely lazy factorial in Haskell -
in similar fashion fibonacci series may generated follows,
fibs :: [integer] fibs = 1 : 1 : zipwith (+) fibs (tail fibs) how define series factorial.
update
embarrassingly enough, tried quite before adding question,
prelude> allow factorial = 2 : 6 : zipwith(*) factorial (tail factorial) prelude> take 5 factorial [2,6,12,72,864] indeed numbers in tail not successive values, start with.
lets take step , remember lazy version comes from:
fib 0 = 1 fib 1 = 1 fib n = fib (n-1) + fib (n-2) we can define factorial similarly:
factorial 0 = 1 factorial n = factorial (n - 1) * n as can see, our zipping operation (*), , sec list won't sublist of factorials, instead [x..] appropriate x:
factorials = 1 : zipwith (*) factorials [x..] what value should x be? well, sec element should 1 = 1 * 1, it's 1, naturally:
factorials = 1 : zipwith (*) factorials [1..] note need give first element, since don't utilize tail or similar. can see, effort correct. used wrong values left hand side:
prelude> allow factorial = 2 : 6 : zipwith (*) [4..] (tail factorial) prelude> take 10 $ factorial [2,6,24,120,720,5040,40320,362880,3628800,39916800] remark: factorial sequence 0!, 1!, 2!, ..., if want oeis compliant start [1,1,...].
haskell lazy-evaluation factorial
No comments:
Post a Comment