Iteration for Factorials

mensanator at aol.com mensanator at aol.com
Thu Oct 25 01:04:04 CEST 2007


On Oct 24, 5:19 pm, marek.ro... at wp.pl wrote:
> Tim Golden napisa (a):
>
> > It's only a moment before the metaclass and
> > the Twisted solution come along. :)
>
> I couldn't resist. It's not as elegant as I hoped, but hey, at least
> it memoizes the intermediate classes :-)
>
> class fact_0(object):
>         value = 1
>
> class fact_meta(object):
>         def __new__(cls, name, bases, attrs):
>                 n = attrs['n']
>                 class_name = 'fact_%i' % n
>                 try:
>                         return globals()[class_name]
>                 except KeyError:
>                         new_class = type(class_name, bases, {})
>                         new_class.value = n * fact(n - 1).value
>                         new_class.__str__ = lambda self: str(self.value)
>                         globals()[class_name] = new_class
>                         return new_class
>
> class fact(object):
>         def __new__(self, n_):
>                 class spanish_inquisition(object):
>                         __metaclass__ = fact_meta
>                         n = n_
>                 return spanish_inquisition()
>
> print fact(5)
> print fact(3)
> print fact(1)

Dare I add fact(0)?

120
6
1
<__main__.fact_0 object at 0x011729F0>

Hmm..not sure what that means, but I bet I can't calculate
combinations.

What about fact(-1)?

120
6
1
<__main__.fact_0 object at 0x011729F0>

Traceback (most recent call last):
  File "C:/Program Files/PyGTK/Python/user/yet_another_factorial.py",
line 31, in <module>
    print fact(-1)
  File "C:/Program Files/PyGTK/Python/user/yet_another_factorial.py",
line 21, in __new__
    class spanish_inquisition(object):
  File "C:/Program Files/PyGTK/Python/user/yet_another_factorial.py",
line 13, in __new__
    new_class.value = n * fact(n - 1).value
  File "C:/Program Files/PyGTK/Python/user/yet_another_factorial.py",
line 21, in __new__
    class spanish_inquisition(object):
  File "C:/Program Files/PyGTK/Python/user/yet_another_factorial.py",
line 13, in __new__
    new_class.value = n * fact(n - 1).value
  File "C:/Program Files/PyGTK/Python/user/yet_another_factorial.py",
line 21, in __new__
    class spanish_inquisition(object):
  File "C:/Program Files/PyGTK/Python/user/yet_another_factorial.py",
line 13, in __new__
    new_class.value = n * fact(n - 1).value
  File "C:/Program Files/PyGTK/Python/user/yet_another_factorial.py",
line 21, in __new__
    class spanish_inquisition(object):
  File "C:/Program Files/PyGTK/Python/user/yet_another_factorial.py",
line 13, in __new__
    new_class.value = n * fact(n - 1).value
  File "C:/Program Files/PyGTK/Python/user/yet_another_factorial.py",
line 21, in __new__
    class spanish_inquisition(object):
  File "C:/Program Files/PyGTK/Python/user/yet_another_factorial.py",
line 13, in __new__
    new_class.value = n * fact(n - 1).value
  File "C:/Program Files/PyGTK/Python/user/yet_another_factorial.py",
line 21, in __new__
    class spanish_inquisition(object):
  File "C:/Program Files/PyGTK/Python/user/yet_another_factorial.py",
line 13, i

Wow! An infinite loop in the Traceback. Not quite the exception
I was looking for.




More information about the Python-list mailing list