没有阶乘函数在 python 中进行指数逼近

without factorial function to do exponent approximation in python

使用循环编写一个程序,使用以下公式计算 的值。

e ^ x = 1+x/1!+x^2/2!+x^3/3!+ ...

注意不要在数学模块中导入阶乘函数。

样本 answers:e=2.71828 和 e^2=7.389056

不使用阶乘:

def calc_exp(x, n = 10):
    ' calc e^x using 1+x/1!+x^2/2!+x^3/3!+ . with a default of 10 terms (n = 10) '
                         
    term = 1                # First term is 1
    result = term           # init result to first term of series
    for k in range(1, n):
        term *= x/k         # current term is (previous term)*x/k  (i.e. effectively x^k/k!)
        result += term      # add current term
        
    return result

测试

for x in [1, 2]:
    print(f'e^{x} = {calc_exp(x)}') # Use print('e^{} = {}'.format(x, calc_exp(x)))
                                    # for earlier than Python 3.6

输出

e^1 = 2.7182815255731922
e^2 = 7.3887125220458545

您可以使用 accumulate() 函数(来自 itertools)用您指定的项数构建序列,然后使用 sum() 函数将它们全部相加:

from itertools import accumulate

def exp(x,terms=20):
    return sum(accumulate(range(1,terms+1),lambda t,i:t*x/(i-1)))

print(exp(1)) # 2.7182818284590455

print(exp(2)) # 7.389056098925863

也可以递归完成(不用库):

def exp(x,terms=20,f=1):
    return 1 + x/f if f==terms else 1 + x*exp(x,terms,f+1)/f

递归函数的工作方式是从上一项开始逐步向后构建系列。这种方法比添加项收敛得更快(可能是因为它在每次迭代时不会损失那么多的精度)

从最深的递归级别到初始函数调用:

f=20: 1 + x/f          F20: 1 + x/20

f=19: 1 + x * F20 / f  F19: 1 + x * (1 + x/20) / 19
                            1 + x/19 + x^2/(20*19)

f=18: 1 + x * F19 / f  F18: 1 + x * (1 + x/19 + x^2/(20*19)) / 18
                            1 + x/18 + x^2/(19*18) + x^3/(20*19*18)

f=17: 1 + x * F18 / f  F17: 1 + x/17 + x^2/(18*17) + x^3/(19*18*17) + ...

...

f=3 : 1 + x * F4  / f   F3: 1 + x/3  + x^2/(4*3)   + x^3/(5*4*3)    + ... 

f=2 : 1 + x * F3  / f   F2: 1 + x/2  + x^2/(3*2)   + x^3/(4*3*2)    + ... 

f=1 : 1 + x * F2  / f  exp: 1 + x/1  + x^2/(2*1)   + x^3/(3*2*1)    + ... 

或者,如果你不喜欢递归,迭代的解决方案也是可以的:

def exp(x,terms=20):
    result = 1
    for f in range(terms,0,-1):
        result = 1 + x * result / f
    return result

请注意,在所有情况下,随着 x 变大,您将需要更多项才能获得所需的精度