了解阶乘和备用代码

时间:2018-08-31 19:07:56

标签: python-3.x

此处是Python新手。我试图理解以下代码来计算欧拉数:

import math

num(i=10):
   sum([1 / math.factorial(z) for z in range(0, i)])

我真的很想更好地掌握如何在代码中完成方程式。我已经阅读了许多教程,但是我对它们的理解不够充分,无法将概念应用于上述代码中的独特情况。有人可以向我逐步解释此代码中发生了什么吗?此外,我还无法弄清楚如何进行阶乘,如果有人能解释如何在不导入的情况下以函数(困难的方式)输入阶乘,这对我很有帮助。

1 个答案:

答案 0 :(得分:1)

为使您理解上面的代码,首先必须了解语言本身。 e=1/0!+1/1!+1/2!+1/3!+1/4!+...,因此您需要执行以下操作:

total=0
for i in range(100):
  total +=1/math.factorial(i)

print(total)
2.7182818284590455

以防您了解什么是for循环及其运行方式。与您上面所写的相比,这要快得多。

现在在python中,有一种叫做列表理解的东西。也就是说,无需预先定义列表即可从for循环创建列表。因此您可以执行[[i for range(10)中的i]],这将创建10个元素的列表。因此,您可以在创建列表时操纵每个元素,即

 [i**2 for i in range(10)]

 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

因此,根据您的情况,您正在做[1/math.factorial(i) for i in range(100)]。这将创建列表[1.0, 1.0, 0.5, 0.16666666666666666, 0.041666666666666664,...],然后通过在此列表上调用sum来添加列表。即sum([1/math.factorial(i) for i in range(100)])

定义自己的阶乘

阶乘是将所有数字从1乘以指定值的函数。 factorial(0)设置为1

factorial(3)= 1*2*3

因此您可以将其定义为:

def factorial(x):
    if x == 0: return 1
    val = 1
    for i in range(1,x+1):
        val *=i
    return val


factorial(3)
Out[40]: 6

factorial(4)
Out[41]: 24

您还可以使用递归定义阶乘:

def factorial(x):
    if x==0: return 1
    else: return x * factorial(x-1)