El nombre e

El nombre e es pot definir mitjançant la sèrie infinita següent:

e = \sum_{i=0}^\infty {1 \over i!} = {1 \over 0!} + {1 \over 1!} + {1 \over 2!} + {1 \over 3!} + {1 \over 4!} + \cdots

Deseu el generador i les funcions següents al fitxer nombre_e.py.

  1. Dissenyeu el generador e_termes que genera els termes de la sèrie infinita anterior, és a dir, {1 \over 0!}, {1
\over 1!}, {1 \over 2!}, i així successivament. Per exemple,

    >>> from nombre_e import e_termes
    
    >>> it = e_termes()
    >>> print '%.5g' % it.next()
    1
    >>> print '%.5g' % it.next()
    1
    >>> print '%.5g' % it.next()
    0.5
    >>> print '%.5g' % it.next()
    0.16667
    >>> print '%.5g' % it.next()
    0.041667
    >>> print '%.5g' % it.next()
    0.0083333
    >>> print '%.5g' % it.next()
    0.0013889
    >>> print '%.5g' % it.next()
    0.00019841
    >>> print '%.5g' % it.next()
    2.4802e-05
    >>> print '%.5g' % it.next()
    2.7557e-06
    >>> print '%.5g' % it.next()
    2.7557e-07
    

Els apartats següents d’aquest problema s’han de resoldre usant les utilitats de itertools i les funcions predefinides, però sense utilitzar iteracions; doncs, està prohibit usar while o for en el cos de les funcions que dissenyeu.

  1. Dissenyeu la funció e_serie_n que donat un nombre natural n calcula la sèrie anterior fins al terme n-éssim inclòs, és a dir, S_{n}: S_n = \sum_{i=0}^n {1 \over i!}

    Per exemple,

    >>> from nombre_e import e_serie_n
    
    >>> print "%.5g" % e_serie_n(0)
    1
    >>> print "%.5g" % e_serie_n(1)
    2
    >>> print "%.5g" % e_serie_n(2)
    2.5
    >>> print "%.5g" % e_serie_n(3)
    2.6667
    >>> print "%.5g" % e_serie_n(4)
    2.7083
    >>> print "%.5g" % e_serie_n(5)
    2.7167
    >>> print "%.5g" % e_serie_n(6)
    2.7181
    >>> print "%.5g" % e_serie_n(7)
    2.7183
    >>> print "%.5g" % e_serie_n(8)
    2.7183
    

    Per aquest apartat, islice us pot resultar útil.

  2. Dissenyeu la funció e_serie_eps que donat l’error admissible \epsilon calcula la sèrie anterior formada per tots els termes més grans que \epsilon, és a dir, S_{n} tal que {1 \over n!} {>} \epsilon i {1 \over (n+1)!}
\leq \epsilon. Per exemple,

    >>> from nombre_e import e_serie_eps
    
    >>> print "%.5g" % e_serie_eps(1e-3)
    2.7181
    >>> print "%.5g" % e_serie_eps(1e-4)
    2.7183
    >>> print "%.5g" % e_serie_eps(1e-5)
    2.7183
    >>> print "%.8g" % e_serie_eps(1e-5)
    2.7182788
    >>> print "%.8g" % e_serie_eps(1e-6)
    2.7182815
    >>> print "%.8g" % e_serie_eps(1e-7)
    2.7182818
    >>> print "%.8g" % e_serie_eps(1e-8)
    2.7182818
    

    Per aquest apartat, takewhile us pot resultar útil.