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.