# Iteration for Factorials

mensanator at aol.com mensanator at aol.com
Mon Oct 22 21:12:29 CEST 2007

```On Oct 22, 1:35 pm, Paul Rudin <paul.nos... at rudin.co.uk> wrote:
> "mensana... at aol.com" <mensana... at aol.com> writes:
> > On Oct 22, 7:50 am, Duncan Booth <duncan.bo... at invalid.invalid> wrote:
> >> Py-Fun <lorna.bu... at gmail.com> wrote:
> >> > I'm stuck trying to write a function that generates a factorial of a
> >> > number using iteration and not recursion.  Any simple ideas would be
> >> > appreciated.
>
> >> This version avoids doing anything fancier than adding 1, so it should be
> >> simple enough for anyone:
>
> >> def factorial(e):
> >>     a = 1
> >>     for b in range(e):
> >>         c = 0
> >>         for j in range(b, -1, -1):
> >>             for d in range(a):
> >>                 c += 1
> >>         a = c
> >>     return a
>
> > Not simple enough for my taste:
>
> >>>> import gmpy
> >>>> gmpy.fac(10)
> > mpz(3628800)
>
> I haven't followed all this thread, but has anyone yet done:
>
> import operator
> def fact(x):
>     return reduce(operator.mul, xrange(1,x))

I hope not.

>>> import operator
>>> def fact(x):
return reduce(operator.mul,xrange(1,x))

>>> fact(3)
2
>>> fact(2)
1
>>> fact(1)

Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
fact(1)
File "<pyshell#7>", line 2, in fact
return reduce(operator.mul,xrange(1,x))
TypeError: reduce() of empty sequence with no initial value

>>> fact(0)

Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
fact(0)
File "<pyshell#7>", line 2, in fact
return reduce(operator.mul,xrange(1,x))
TypeError: reduce() of empty sequence with no initial value

I think you need to make it a bit more complicated.

```