2015-07-16 14 views
5

Sto tentando di calcolare e^x utilizzando la ricorsione, e^x = e^(x/2) * e^(x/2), e il terzo ordine Maclaurin expansion per e^x e lo script continua a tornare 1. Non sto cercando una soluzione più accurata, semplicemente per capire dove lo script va storto:)Calcolo exp (x) con l'uso della ricorsione in Python

Il mio pensiero è che con iterazioni sufficienti dovrebbe finire con (1 + x/N + (x/N)^2/2)^N quando il valore della funzione scende sotto il limite.

def exp(x): 
     if abs(x)<0.0001: 
      return 1+x+x**2/2 
     else: 
      y=exp(x/2) 
      return y*y 
+0

put 'da __future__ import division' nella parte superiore dello script –

risposta

7

Prova a modificare (si noti il ​​2.0 nella chiamata ricorsiva):

def exp(x): 
    if abs(x) < 0.0001: 
     return 1 + x + x**2/2.0 
    else: 
     y = exp(x/2.0) 
     return y * y 

Si sta fallendo perché se si passa un intero per x, dicono 1, quindi x/2 la divisione intera (in python 2. x), che risulterebbe in 0 anziché 0.5. Usando x/2.0, impone a python l'uso della divisione float.

+2

Si noti che questo è solo un problema in Python 2. In 3.x,'/'indica sempre la vera divisione, indipendentemente dagli operandi. – Kevin

+0

Nota che ho aggiornato l'altra divisione (in 'if'). Senza di ciò, non avrebbe funzionato per x = 0, perché non avrebbe mai ottenuto la clausola else, che la converte in float. Così avrebbe restituito '0' per' exp (0) 'che non è corretto. –

3
def exp(x): 
    if abs(x)<0.0001: 
     return 1+x+(x**2)/2.0 
    else: 
     y=exp(x/2.0) 
     return y*y 

Divisione intera tronca. Hai bisogno di galleggianti qui.

Problemi correlati